summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FILES.byname206
-rw-r--r--FILES.byname.gzbin2513731 -> 2513739 bytes
-rw-r--r--FILES.last07days356
-rw-r--r--biblio/ctan-bibdata/ctan.bib57
-rw-r--r--biblio/ctan-bibdata/ctan.pdfbin3655354 -> 3653583 bytes
-rw-r--r--graphics/pgf/contrib/pixelart/CHANGELOG.md13
-rw-r--r--graphics/pgf/contrib/pixelart/README.md4
-rw-r--r--graphics/pgf/contrib/pixelart/pixelart.lua26
-rw-r--r--graphics/pgf/contrib/pixelart/pixelart.pdfbin231203 -> 232668 bytes
-rw-r--r--graphics/pgf/contrib/pixelart/pixelart.sty18
-rw-r--r--graphics/pgf/contrib/pixelart/pixelart.tex6
-rw-r--r--graphics/pgf/contrib/pixelart/pixelart0.pdfbin152390 -> 152529 bytes
-rw-r--r--graphics/pstricks/contrib/luapstricks/luapstricks.lua23
-rw-r--r--macros/generic/chemfig/README4
-rw-r--r--macros/generic/chemfig/chemfig-en.pdfbin1141846 -> 714456 bytes
-rw-r--r--macros/generic/chemfig/chemfig-en.tex49
-rw-r--r--macros/generic/chemfig/chemfig-fr.pdfbin1170720 -> 727414 bytes
-rw-r--r--macros/generic/chemfig/chemfig-fr.tex47
-rw-r--r--macros/generic/chemfig/chemfig.tex1438
-rw-r--r--macros/generic/soul/README.md27
-rw-r--r--macros/generic/soul/soul-ori.dtx4469
-rw-r--r--macros/generic/soul/soul-ori.pdfbin0 -> 509006 bytes
-rw-r--r--macros/generic/soul/soul.dtx5416
-rw-r--r--macros/generic/soul/soul.ins79
-rw-r--r--macros/generic/soul/soul.pdfbin388702 -> 377440 bytes
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix-french.pdfbin511895 -> 527832 bytes
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix-french.tex389
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix.dtx540
-rw-r--r--macros/latex/contrib/nicematrix/nicematrix.pdfbin1331647 -> 1339763 bytes
-rw-r--r--macros/latex/contrib/soulutf8/README.md17
-rw-r--r--macros/latex/contrib/soulutf8/soulutf8.dtx1298
-rw-r--r--macros/latex/contrib/soulutf8/soulutf8.pdfbin351673 -> 0 bytes
-rw-r--r--macros/latex/contrib/zref-clever/CHANGELOG.md7
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever-code.pdfbin1280514 -> 1281092 bytes
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever.dtx2
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever.pdfbin345898 -> 345913 bytes
-rw-r--r--macros/latex/contrib/zref-clever/zref-clever.tex7
-rw-r--r--macros/xetex/latex/xduts/xduts.dtx206
-rw-r--r--macros/xetex/latex/xduts/xduts.pdfbin330023 -> 330063 bytes
-rw-r--r--obsolete/macros/generic/soul/Makefile (renamed from macros/generic/soul/Makefile)0
-rw-r--r--obsolete/macros/generic/soul/soul.dtx4520
-rw-r--r--obsolete/macros/generic/soul/soul.ins10
-rw-r--r--obsolete/macros/generic/soul/soul.pdfbin0 -> 388702 bytes
-rw-r--r--obsolete/macros/generic/soul/soul.txt (renamed from macros/generic/soul/soul.txt)0
-rw-r--r--systems/doc/hitex/hiformat.hntbin1114325 -> 1129777 bytes
-rw-r--r--systems/doc/hitex/hiformat.pdfbin1255399 -> 1288384 bytes
-rw-r--r--systems/doc/hitex/hintmac.tex4
-rw-r--r--systems/doc/hitex/hitexman.hntbin541228 -> 541120 bytes
-rw-r--r--systems/doc/hitex/hitexman.pdfbin234052 -> 234052 bytes
-rw-r--r--systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl3
-rw-r--r--systems/texlive/tlnet/tlpkg/texlive.tlpdb154
-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.xzbin2449820 -> 2451496 bytes
-rw-r--r--timestamp2
56 files changed, 12297 insertions, 7118 deletions
diff --git a/FILES.byname b/FILES.byname
index ba59e41d47..4b2c48547d 100644
--- a/FILES.byname
+++ b/FILES.byname
@@ -2048,12 +2048,12 @@
2022/12/25 | 1673 | biblio/citation-style-language/README.md
2022/12/25 | 11958 | biblio/citation-style-language/vancouver.csl
2022/12/25 | 604004 | biblio/citation-style-language.zip
-2023/02/17 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/02/18 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2022/10/08 | 127 | biblio/ctan-bibdata/biblatex-ctan/ctan.cbx
-2023/02/17 | 2767751 | biblio/ctan-bibdata/ctan.bib
-2023/02/17 | 3652922 | biblio/ctan-bibdata/ctan.pdf
+2023/02/18 | 2768178 | biblio/ctan-bibdata/ctan.bib
+2023/02/18 | 3655354 | biblio/ctan-bibdata/ctan.pdf
2023/01/16 | 1489 | biblio/ctan-bibdata/README
-2023/02/17 | 4049088 | biblio/ctan-bibdata.zip
+2023/02/18 | 4050750 | biblio/ctan-bibdata.zip
2022/02/06 | 3110 | biblio/pbibtex/pbibtex-base/cpp.awk
2022/02/06 | 1009 | biblio/pbibtex/pbibtex-base/generate.sh
2022/02/06 | 22422 | biblio/pbibtex/pbibtex-base/jabbrv.bst
@@ -5407,7 +5407,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
-2023/02/17 | 73700 | FILES.last07days
+2023/02/18 | 76760 | 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
@@ -159826,16 +159826,16 @@
2020/07/27 | 8446 | graphics/pgf/contrib/pinoutikz/pinoutikz.sty
2020/07/27 | 1503 | graphics/pgf/contrib/pinoutikz/README.md
2020/07/27 | 77982 | graphics/pgf/contrib/pinoutikz.zip
-2022/11/16 | 871 | graphics/pgf/contrib/pixelart/CHANGELOG.md
-2022/11/16 | 19106 | graphics/pgf/contrib/pixelart/LICENSE.txt
-2022/11/16 | 152390 | graphics/pgf/contrib/pixelart/pixelart0.pdf
-2022/11/16 | 3044 | graphics/pgf/contrib/pixelart/pixelart0.sty
-2022/11/16 | 15144 | graphics/pgf/contrib/pixelart/pixelart0.tex
-2022/11/16 | 16913 | graphics/pgf/contrib/pixelart/pixelart.lua
-2022/11/16 | 231203 | graphics/pgf/contrib/pixelart/pixelart.pdf
-2022/11/16 | 6469 | graphics/pgf/contrib/pixelart/pixelart.sty
-2022/11/16 | 33443 | graphics/pgf/contrib/pixelart/pixelart.tex
-2022/11/16 | 1049 | graphics/pgf/contrib/pixelart/README.md
+2023/02/18 | 1246 | graphics/pgf/contrib/pixelart/CHANGELOG.md
+2023/02/18 | 19106 | graphics/pgf/contrib/pixelart/LICENSE.txt
+2023/02/18 | 152529 | graphics/pgf/contrib/pixelart/pixelart0.pdf
+2023/02/18 | 3044 | graphics/pgf/contrib/pixelart/pixelart0.sty
+2023/02/18 | 15144 | graphics/pgf/contrib/pixelart/pixelart0.tex
+2023/02/18 | 17541 | graphics/pgf/contrib/pixelart/pixelart.lua
+2023/02/18 | 232668 | graphics/pgf/contrib/pixelart/pixelart.pdf
+2023/02/18 | 7144 | graphics/pgf/contrib/pixelart/pixelart.sty
+2023/02/18 | 33668 | graphics/pgf/contrib/pixelart/pixelart.tex
+2023/02/18 | 1049 | graphics/pgf/contrib/pixelart/README.md
2023/01/25 | 36 | graphics/pgf/contrib/pixelarttikz/doc/base.csv
2023/01/25 | 990 | graphics/pgf/contrib/pixelarttikz/doc/cap.csv
2023/01/25 | 490717 | graphics/pgf/contrib/pixelarttikz/doc/PixelArtTikz-doc-en.pdf
@@ -159846,7 +159846,7 @@
2023/01/25 | 411 | graphics/pgf/contrib/pixelarttikz/README.md
2023/01/25 | 9058 | graphics/pgf/contrib/pixelarttikz/tex/PixelArtTikz.sty
2023/01/26 | 962444 | graphics/pgf/contrib/pixelarttikz.zip
-2022/11/16 | 395618 | graphics/pgf/contrib/pixelart.zip
+2023/02/18 | 397430 | graphics/pgf/contrib/pixelart.zip
2019/09/30 | 649 | graphics/pgf/contrib/prooftrees/manifest.txt
2019/09/30 | 755 | graphics/pgf/contrib/prooftrees/prooftrees_biber.bib
2019/09/30 | 858384 | graphics/pgf/contrib/prooftrees/prooftrees.pdf
@@ -163040,10 +163040,10 @@
2014/07/24 | 36126 | graphics/pstricks/contrib/dsptricks/dsptricks.sty
2014/07/25 | 606 | graphics/pstricks/contrib/dsptricks/README
2014/07/25 | 186879 | graphics/pstricks/contrib/dsptricks.zip
-2022/09/11 | 132041 | graphics/pstricks/contrib/luapstricks/luapstricks.lua
-2022/09/11 | 7624 | graphics/pstricks/contrib/luapstricks/PSTricksDotFont.otf
-2022/09/11 | 3369 | graphics/pstricks/contrib/luapstricks/README.md
-2022/09/11 | 31889 | graphics/pstricks/contrib/luapstricks.zip
+2023/02/18 | 132439 | graphics/pstricks/contrib/luapstricks/luapstricks.lua
+2023/02/18 | 7624 | graphics/pstricks/contrib/luapstricks/PSTricksDotFont.otf
+2023/02/18 | 3369 | graphics/pstricks/contrib/luapstricks/README.md
+2023/02/18 | 31970 | graphics/pstricks/contrib/luapstricks.zip
2009/08/26 | 42811 | graphics/pstricks/contrib/makeplot/makeplot.dtx
2009/08/26 | 2006 | graphics/pstricks/contrib/makeplot/makeplot.ins
2009/08/26 | 147019 | graphics/pstricks/contrib/makeplot/makeplot.pdf
@@ -193473,7 +193473,6 @@
2023/01/03 | 1521017 | install/macros/latex/contrib/siunitx.tds.zip
2019/10/15 | 315856 | install/macros/latex/contrib/skmath.tds.zip
2019/10/16 | 345652 | install/macros/latex/contrib/skrapport.tds.zip
-2019/12/15 | 357584 | install/macros/latex/contrib/soulutf8.tds.zip
2016/02/18 | 469004 | install/macros/latex/contrib/splitindex.tds.zip
2009/08/10 | 109289 | install/macros/latex/contrib/spverbatim.tds.zip
2009/09/04 | 137721 | install/macros/latex/contrib/stdclsdv.tds.zip
@@ -193527,7 +193526,7 @@
2022/10/31 | 367048 | install/macros/latex/contrib/ydoc.tds.zip
2020/04/09 | 806385 | install/macros/latex/contrib/zhlipsum.tds.zip
2022/07/14 | 321454 | install/macros/latex/contrib/zhnumber.tds.zip
-2023/02/13 | 1685007 | install/macros/latex/contrib/zref-clever.tds.zip
+2023/02/18 | 1685887 | install/macros/latex/contrib/zref-clever.tds.zip
2022/12/03 | 39466146 | install/macros/latex-dev/latex-base-dev.tds.zip
2022/10/31 | 2795153 | install/macros/latex-dev/required/latex-amsmath-dev.tds.zip
2022/12/03 | 277960 | install/macros/latex-dev/required/latex-firstaid-dev.tds.zip
@@ -201247,15 +201246,15 @@
2015/05/22 | 6015 | macros/generic/catcodes/use/catchdq.sty
2012/11/07 | 4853 | macros/generic/catcodes/use/stacklet.sty
2015/11/15 | 557118 | macros/generic/catcodes.zip
-2022/09/27 | 1141846 | macros/generic/chemfig/chemfig-en.pdf
-2022/09/27 | 186208 | macros/generic/chemfig/chemfig-en.tex
-2022/09/27 | 1170720 | macros/generic/chemfig/chemfig-fr.pdf
-2022/09/27 | 200706 | macros/generic/chemfig/chemfig-fr.tex
-2022/09/27 | 5803 | macros/generic/chemfig/chemfig-lewis.tex
-2022/09/27 | 388 | macros/generic/chemfig/chemfig.sty
-2022/09/27 | 118864 | macros/generic/chemfig/chemfig.tex
-2022/09/27 | 1125 | macros/generic/chemfig/README
-2022/09/27 | 2418554 | macros/generic/chemfig.zip
+2023/02/18 | 714456 | macros/generic/chemfig/chemfig-en.pdf
+2023/02/18 | 186018 | macros/generic/chemfig/chemfig-en.tex
+2023/02/18 | 727414 | macros/generic/chemfig/chemfig-fr.pdf
+2023/02/18 | 200523 | macros/generic/chemfig/chemfig-fr.tex
+2023/02/18 | 5803 | macros/generic/chemfig/chemfig-lewis.tex
+2023/02/18 | 388 | macros/generic/chemfig/chemfig.sty
+2023/02/18 | 121813 | macros/generic/chemfig/chemfig.tex
+2023/02/18 | 1125 | macros/generic/chemfig/README
+2023/02/18 | 1565314 | macros/generic/chemfig.zip
1996/04/17 | 17290 | macros/generic/code128/code128.tex
1996/04/17 | 716 | macros/generic/code128/README
1996/04/17 | 4503 | macros/generic/code128/test128.tex
@@ -202368,12 +202367,13 @@
2022/10/01 | 161 | macros/generic/simplekv/simplekv.sty
2022/10/01 | 8835 | macros/generic/simplekv/simplekv.tex
2022/10/01 | 133045 | macros/generic/simplekv.zip
-2003/11/17 | 1141 | macros/generic/soul/Makefile
-2003/11/17 | 135135 | macros/generic/soul/soul.dtx
-2003/11/17 | 301 | macros/generic/soul/soul.ins
-2004/11/09 | 388702 | macros/generic/soul/soul.pdf
-2003/11/17 | 1843 | macros/generic/soul/soul.txt
-2005/04/30 | 355369 | macros/generic/soul.zip
+2023/02/18 | 762 | macros/generic/soul/README.md
+2023/02/18 | 30174 | macros/generic/soul/soul.dtx
+2023/02/18 | 1840 | macros/generic/soul/soul.ins
+2023/02/18 | 133473 | macros/generic/soul/soul-ori.dtx
+2023/02/18 | 509006 | macros/generic/soul/soul-ori.pdf
+2023/02/18 | 377440 | macros/generic/soul/soul.pdf
+2023/02/18 | 901082 | macros/generic/soul.zip
2020/05/03 | 1032 | macros/generic/systeme/README
2020/05/03 | 76904 | macros/generic/systeme/systeme_fr.pdf
2020/05/03 | 25562 | macros/generic/systeme/systeme_fr.tex
@@ -229224,13 +229224,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
-2023/02/04 | 758830 | macros/latex/contrib/nicematrix/nicematrix.dtx
-2023/02/05 | 511895 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
-2022/12/19 | 199173 | macros/latex/contrib/nicematrix/nicematrix-french.tex
+2023/02/18 | 763743 | macros/latex/contrib/nicematrix/nicematrix.dtx
+2023/02/18 | 527832 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
+2023/02/18 | 203053 | macros/latex/contrib/nicematrix/nicematrix-french.tex
2022/12/21 | 1423 | macros/latex/contrib/nicematrix/nicematrix.ins
-2023/02/05 | 1331647 | macros/latex/contrib/nicematrix/nicematrix.pdf
+2023/02/18 | 1339763 | macros/latex/contrib/nicematrix/nicematrix.pdf
2021/11/10 | 1023 | macros/latex/contrib/nicematrix/README.md
-2023/02/05 | 2003340 | macros/latex/contrib/nicematrix.zip
+2023/02/18 | 2027828 | 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
@@ -235152,10 +235152,6 @@
2021/10/15 | 7687 | macros/latex/contrib/soulpos/soulpos.sty
2021/10/15 | 10703 | macros/latex/contrib/soulpos/soulpos.tex
2021/10/15 | 179576 | macros/latex/contrib/soulpos.zip
-2019/12/15 | 411 | macros/latex/contrib/soulutf8/README.md
-2019/12/15 | 34870 | macros/latex/contrib/soulutf8/soulutf8.dtx
-2019/12/15 | 351673 | macros/latex/contrib/soulutf8/soulutf8.pdf
-2019/12/17 | 352864 | macros/latex/contrib/soulutf8.zip
2019/04/05 | 1354 | macros/latex/contrib/soup/README.md
2019/04/05 | 26304 | macros/latex/contrib/soup/soup.dtx
2019/04/05 | 2178 | macros/latex/contrib/soup/soup.ins
@@ -241336,16 +241332,16 @@
2022/07/07 | 2599 | macros/latex/contrib/zref-check/zref-check.ins
2022/07/07 | 464993 | macros/latex/contrib/zref-check/zref-check.pdf
2022/07/07 | 2718 | macros/latex/contrib/zref-check/zref-check.tex
-2023/02/13 | 5264 | macros/latex/contrib/zref-clever/CHANGELOG.md
-2023/02/13 | 70 | macros/latex/contrib/zref-clever/DEPENDS.txt
-2023/02/13 | 823 | macros/latex/contrib/zref-clever/README.md
-2023/02/13 | 1648421 | macros/latex/contrib/zref-clever.zip
-2023/02/13 | 1280514 | macros/latex/contrib/zref-clever/zref-clever-code.pdf
-2023/02/13 | 1539 | macros/latex/contrib/zref-clever/zref-clever-code.tex
-2023/02/13 | 352491 | macros/latex/contrib/zref-clever/zref-clever.dtx
-2023/02/13 | 3179 | macros/latex/contrib/zref-clever/zref-clever.ins
-2023/02/13 | 345898 | macros/latex/contrib/zref-clever/zref-clever.pdf
-2023/02/13 | 128670 | macros/latex/contrib/zref-clever/zref-clever.tex
+2023/02/18 | 5445 | macros/latex/contrib/zref-clever/CHANGELOG.md
+2023/02/18 | 70 | macros/latex/contrib/zref-clever/DEPENDS.txt
+2023/02/18 | 823 | macros/latex/contrib/zref-clever/README.md
+2023/02/18 | 1649295 | macros/latex/contrib/zref-clever.zip
+2023/02/18 | 1281092 | macros/latex/contrib/zref-clever/zref-clever-code.pdf
+2023/02/18 | 1539 | macros/latex/contrib/zref-clever/zref-clever-code.tex
+2023/02/18 | 352491 | macros/latex/contrib/zref-clever/zref-clever.dtx
+2023/02/18 | 3179 | macros/latex/contrib/zref-clever/zref-clever.ins
+2023/02/18 | 345913 | macros/latex/contrib/zref-clever/zref-clever.pdf
+2023/02/18 | 128822 | macros/latex/contrib/zref-clever/zref-clever.tex
2022/04/07 | 581 | macros/latex/contrib/zref/README.md
2023/01/03 | 1829 | macros/latex/contrib/zref-vario/CHANGELOG.md
2023/01/03 | 31 | macros/latex/contrib/zref-vario/DEPENDS.txt
@@ -253436,12 +253432,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
-2023/02/17 | 3668 | macros/xetex/latex/xduts/README.md
-2023/02/17 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
-2023/02/17 | 280443 | macros/xetex/latex/xduts/xduts.dtx
-2023/02/17 | 1188 | macros/xetex/latex/xduts/xduts.ins
-2023/02/17 | 330023 | macros/xetex/latex/xduts/xduts.pdf
-2023/02/17 | 1261336 | macros/xetex/latex/xduts.zip
+2023/02/18 | 3668 | macros/xetex/latex/xduts/README.md
+2023/02/18 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
+2023/02/18 | 280714 | macros/xetex/latex/xduts/xduts.dtx
+2023/02/18 | 1188 | macros/xetex/latex/xduts/xduts.ins
+2023/02/18 | 330063 | macros/xetex/latex/xduts/xduts.pdf
+2023/02/18 | 1261090 | 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
@@ -269481,6 +269477,12 @@
2002/12/17 | 36904 | obsolete/macros/generic/diagrams/barr/diagram.tex
1993/01/18 | 9453 | obsolete/macros/generic/proofs/taylor/boxproof-old.tex
1999/12/02 | 21467 | obsolete/macros/generic/proofs/taylor/boxproof.tex
+2003/11/17 | 1141 | obsolete/macros/generic/soul/Makefile
+2003/11/17 | 135135 | obsolete/macros/generic/soul/soul.dtx
+2003/11/17 | 301 | obsolete/macros/generic/soul/soul.ins
+2004/11/09 | 388702 | obsolete/macros/generic/soul/soul.pdf
+2003/11/17 | 1843 | obsolete/macros/generic/soul/soul.txt
+2023/02/18 | 355369 | obsolete/macros/generic/soul.zip
1990/08/29 | 12844 | obsolete/macros/latex209/contrib/aaai/aaai-doc.tex
1989/12/21 | 5731 | obsolete/macros/latex209/contrib/aaai/aaai.sty
2005/11/22 | 7632 | obsolete/macros/latex209/contrib/aaai.zip
@@ -285424,9 +285426,9 @@
2019/10/13 | 444 | systems/doc/luatex/luatex-logos.tex
2021/12/31 | 34337 | systems/doc/luatex/luatex-lua.tex
2022/10/28 | 72191 | systems/doc/luatex/luatex-math.tex
-2023/01/24 | 49947 | systems/doc/luatex/luatex-modifications.tex
-2023/01/17 | 98187 | systems/doc/luatex/luatex-nodes.tex
-2023/02/06 | 1788043 | systems/doc/luatex/luatex.pdf
+2023/02/18 | 50127 | systems/doc/luatex/luatex-modifications.tex
+2023/02/18 | 98490 | systems/doc/luatex/luatex-nodes.tex
+2023/02/18 | 1788486 | systems/doc/luatex/luatex.pdf
2020/03/14 | 5012 | systems/doc/luatex/luatex-preamble.tex
2019/10/13 | 1118 | systems/doc/luatex/luatex-registers.tex
2019/10/13 | 242 | systems/doc/luatex/luatex-statistics.tex
@@ -285434,7 +285436,7 @@
2023/01/17 | 3639 | systems/doc/luatex/luatex.tex
2023/02/06 | 98590 | systems/doc/luatex/luatex-tex.tex
2019/10/13 | 1313 | systems/doc/luatex/luatex-titlepage.tex
-2023/02/07 | 2069014 | systems/doc/luatex.zip
+2023/02/18 | 2069523 | systems/doc/luatex.zip
2015/04/30 | 66584 | systems/doc/metapost/CHANGES
2009/05/30 | 7430 | systems/doc/metapost/grdemo-doc.pdf
2009/05/30 | 3044 | systems/doc/metapost/grdemo.pdf
@@ -287656,8 +287658,8 @@
2019/02/28 | 293444 | systems/texlive/tlnet/archive/algorithms.doc.r42428.tar.xz
2019/02/28 | 3472 | systems/texlive/tlnet/archive/algorithms.r42428.tar.xz
2019/02/28 | 11940 | systems/texlive/tlnet/archive/algorithms.source.r42428.tar.xz
-2022/10/09 | 350996 | systems/texlive/tlnet/archive/algpseudocodex.doc.r64654.tar.xz
-2022/10/09 | 6984 | systems/texlive/tlnet/archive/algpseudocodex.r64654.tar.xz
+2023/02/18 | 352120 | systems/texlive/tlnet/archive/algpseudocodex.doc.r65860.tar.xz
+2023/02/18 | 9192 | systems/texlive/tlnet/archive/algpseudocodex.r65860.tar.xz
2019/02/28 | 2568 | systems/texlive/tlnet/archive/alg.r15878.tar.xz
2019/02/28 | 5768 | systems/texlive/tlnet/archive/alg.source.r15878.tar.xz
2020/08/01 | 173088 | systems/texlive/tlnet/archive/algxpar.doc.r56006.tar.xz
@@ -289253,8 +289255,8 @@
2022/05/09 | 27104 | systems/texlive/tlnet/archive/changebar.source.r63259.tar.xz
2019/02/28 | 57396 | systems/texlive/tlnet/archive/changelayout.doc.r16094.tar.xz
2019/02/28 | 3872 | systems/texlive/tlnet/archive/changelayout.r16094.tar.xz
-2020/09/14 | 164420 | systems/texlive/tlnet/archive/changelog.doc.r56338.tar.xz
-2020/09/14 | 3024 | systems/texlive/tlnet/archive/changelog.r56338.tar.xz
+2023/02/18 | 173956 | systems/texlive/tlnet/archive/changelog.doc.r65861.tar.xz
+2023/02/18 | 3324 | systems/texlive/tlnet/archive/changelog.r65861.tar.xz
2019/02/28 | 274712 | systems/texlive/tlnet/archive/changepage.doc.r15878.tar.xz
2019/02/28 | 2612 | systems/texlive/tlnet/archive/changepage.r15878.tar.xz
2019/02/28 | 5956 | systems/texlive/tlnet/archive/changepage.source.r15878.tar.xz
@@ -289731,7 +289733,7 @@
2023/02/12 | 968 | systems/texlive/tlnet/archive/collection-luatex.r65791.tar.xz
2023/02/08 | 1664 | systems/texlive/tlnet/archive/collection-mathscience.r65753.tar.xz
2022/11/01 | 556 | systems/texlive/tlnet/archive/collection-metapost.r64878.tar.xz
-2022/11/08 | 484 | systems/texlive/tlnet/archive/collection-music.r64966.tar.xz
+2023/02/18 | 496 | systems/texlive/tlnet/archive/collection-music.r65862.tar.xz
2023/02/10 | 1564 | systems/texlive/tlnet/archive/collection-pictures.r65768.tar.xz
2023/01/26 | 976 | systems/texlive/tlnet/archive/collection-plaingeneric.r65622.tar.xz
2022/12/27 | 816 | systems/texlive/tlnet/archive/collection-pstricks.r65367.tar.xz
@@ -294723,7 +294725,7 @@
2019/11/07 | 263752 | systems/texlive/tlnet/archive/luatexbase.doc.r52663.tar.xz
2019/11/07 | 3508 | systems/texlive/tlnet/archive/luatexbase.r52663.tar.xz
2019/11/07 | 8444 | systems/texlive/tlnet/archive/luatexbase.source.r52663.tar.xz
-2023/02/07 | 1905336 | systems/texlive/tlnet/archive/luatex.doc.r65743.tar.xz
+2023/02/18 | 1905932 | systems/texlive/tlnet/archive/luatex.doc.r65866.tar.xz
2022/03/14 | 1752140 | systems/texlive/tlnet/archive/luatex.i386-cygwin.r62676.tar.xz
2022/03/13 | 1731248 | systems/texlive/tlnet/archive/luatex.i386-freebsd.r62668.tar.xz
2022/03/13 | 1874248 | systems/texlive/tlnet/archive/luatex.i386-linux.r62668.tar.xz
@@ -294734,7 +294736,7 @@
2023/02/12 | 83900 | systems/texlive/tlnet/archive/luatexja.source.r65790.tar.xz
2022/11/02 | 350116 | systems/texlive/tlnet/archive/luatexko.doc.r64893.tar.xz
2022/11/02 | 23448 | systems/texlive/tlnet/archive/luatexko.r64893.tar.xz
-2023/02/07 | 12832 | systems/texlive/tlnet/archive/luatex.r65743.tar.xz
+2023/02/18 | 12832 | systems/texlive/tlnet/archive/luatex.r65866.tar.xz
2019/02/28 | 317312 | systems/texlive/tlnet/archive/luatextra.doc.r20747.tar.xz
2019/02/28 | 1056 | systems/texlive/tlnet/archive/luatextra.r20747.tar.xz
2019/02/28 | 3492 | systems/texlive/tlnet/archive/luatextra.source.r20747.tar.xz
@@ -297766,6 +297768,8 @@
2019/02/28 | 9372 | systems/texlive/tlnet/archive/recipecard.source.r15878.tar.xz
2020/03/04 | 23600 | systems/texlive/tlnet/archive/recipe.doc.r54080.tar.xz
2020/03/04 | 1956 | systems/texlive/tlnet/archive/recipe.r54080.tar.xz
+2023/02/18 | 130652 | systems/texlive/tlnet/archive/recorder-fingering.doc.r65862.tar.xz
+2023/02/18 | 3660 | systems/texlive/tlnet/archive/recorder-fingering.r65862.tar.xz
2022/07/27 | 123836 | systems/texlive/tlnet/archive/rec-thy.doc.r63982.tar.xz
2022/07/27 | 15364 | systems/texlive/tlnet/archive/rec-thy.r63982.tar.xz
2019/02/28 | 115552 | systems/texlive/tlnet/archive/rectopma.doc.r19980.tar.xz
@@ -298304,8 +298308,8 @@
2019/02/28 | 292656 | systems/texlive/tlnet/archive/simplecv.doc.r35537.tar.xz
2019/02/28 | 2112 | systems/texlive/tlnet/archive/simplecv.r35537.tar.xz
2019/02/28 | 5844 | systems/texlive/tlnet/archive/simplecv.source.r35537.tar.xz
-2023/02/04 | 2004596 | systems/texlive/tlnet/archive/simpleicons.doc.r65720.tar.xz
-2023/02/04 | 2729040 | systems/texlive/tlnet/archive/simpleicons.r65720.tar.xz
+2023/02/18 | 2006600 | systems/texlive/tlnet/archive/simpleicons.doc.r65858.tar.xz
+2023/02/18 | 2733556 | systems/texlive/tlnet/archive/simpleicons.r65858.tar.xz
2019/02/28 | 224844 | systems/texlive/tlnet/archive/simpleinvoice.doc.r45673.tar.xz
2019/02/28 | 2420 | systems/texlive/tlnet/archive/simpleinvoice.r45673.tar.xz
2022/10/03 | 130940 | systems/texlive/tlnet/archive/simplekv.doc.r64578.tar.xz
@@ -298899,8 +298903,8 @@
2019/02/28 | 436 | systems/texlive/tlnet/archive/tamethebeast.r15878.tar.xz
2019/02/28 | 117652 | systems/texlive/tlnet/archive/t-angles.doc.r15878.tar.xz
2019/02/28 | 5684 | systems/texlive/tlnet/archive/t-angles.r15878.tar.xz
-2023/02/01 | 723896 | systems/texlive/tlnet/archive/tangramtikz.doc.r65697.tar.xz
-2023/02/01 | 4820 | systems/texlive/tlnet/archive/tangramtikz.r65697.tar.xz
+2023/02/18 | 727008 | systems/texlive/tlnet/archive/tangramtikz.doc.r65859.tar.xz
+2023/02/18 | 5052 | systems/texlive/tlnet/archive/tangramtikz.r65859.tar.xz
2019/02/28 | 27740 | systems/texlive/tlnet/archive/tap.doc.r31731.tar.xz
2019/02/28 | 53796 | systems/texlive/tlnet/archive/tapir.doc.r20484.tar.xz
2019/02/28 | 51876 | systems/texlive/tlnet/archive/tapir.r20484.tar.xz
@@ -299254,7 +299258,7 @@
2022/09/13 | 600 | systems/texlive/tlnet/archive/texlive-scripts.amd64-freebsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.amd64-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.armhf-linux.r64356.tar.xz
-2023/02/17 | 424612 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65850.tar.xz
+2023/02/18 | 424612 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65857.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
@@ -299278,7 +299282,7 @@
2022/09/13 | 592 | systems/texlive/tlnet/archive/texlive-scripts.i386-linux.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-netbsd.r64356.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.i386-solaris.r64356.tar.xz
-2023/02/17 | 113820 | systems/texlive/tlnet/archive/texlive-scripts.r65850.tar.xz
+2023/02/18 | 113796 | systems/texlive/tlnet/archive/texlive-scripts.r65857.tar.xz
2022/09/13 | 580 | systems/texlive/tlnet/archive/texlive-scripts.universal-darwin.r64356.tar.xz
2022/11/29 | 36264 | systems/texlive/tlnet/archive/texlive-scripts.win32.r65128.tar.xz
2022/09/13 | 596 | systems/texlive/tlnet/archive/texlive-scripts.x86_64-cygwin.r64356.tar.xz
@@ -299535,9 +299539,9 @@
2019/02/28 | 93936 | systems/texlive/tlnet/archive/thmbox.doc.r15878.tar.xz
2019/02/28 | 2416 | systems/texlive/tlnet/archive/thmbox.r15878.tar.xz
2019/02/28 | 8324 | systems/texlive/tlnet/archive/thmbox.source.r15878.tar.xz
-2023/02/05 | 265092 | systems/texlive/tlnet/archive/thmtools.doc.r65733.tar.xz
-2023/02/05 | 13412 | systems/texlive/tlnet/archive/thmtools.r65733.tar.xz
-2023/02/05 | 20732 | systems/texlive/tlnet/archive/thmtools.source.r65733.tar.xz
+2023/02/18 | 265140 | systems/texlive/tlnet/archive/thmtools.doc.r65863.tar.xz
+2023/02/18 | 13416 | systems/texlive/tlnet/archive/thmtools.r65863.tar.xz
+2023/02/18 | 20756 | systems/texlive/tlnet/archive/thmtools.source.r65863.tar.xz
2019/02/28 | 290856 | systems/texlive/tlnet/archive/threadcol.doc.r28754.tar.xz
2019/02/28 | 1764 | systems/texlive/tlnet/archive/threadcol.r28754.tar.xz
2019/02/28 | 93120 | systems/texlive/tlnet/archive/threadcol.source.r28754.tar.xz
@@ -300723,9 +300727,9 @@
2022/04/24 | 693304 | systems/texlive/tlnet/archive/xduthesis.doc.r63116.tar.xz
2022/04/24 | 113392 | systems/texlive/tlnet/archive/xduthesis.r63116.tar.xz
2022/04/24 | 15976 | systems/texlive/tlnet/archive/xduthesis.source.r63116.tar.xz
-2023/02/12 | 327600 | systems/texlive/tlnet/archive/xduts.doc.r65794.tar.xz
-2023/02/12 | 523820 | systems/texlive/tlnet/archive/xduts.r65794.tar.xz
-2023/02/12 | 44308 | systems/texlive/tlnet/archive/xduts.source.r65794.tar.xz
+2023/02/18 | 327672 | systems/texlive/tlnet/archive/xduts.doc.r65864.tar.xz
+2023/02/18 | 523832 | systems/texlive/tlnet/archive/xduts.r65864.tar.xz
+2023/02/18 | 44372 | systems/texlive/tlnet/archive/xduts.source.r65864.tar.xz
2022/03/01 | 527308 | systems/texlive/tlnet/archive/xdvi.aarch64-linux.r62280.tar.xz
2022/02/27 | 566196 | systems/texlive/tlnet/archive/xdvi.amd64-freebsd.r62206.tar.xz
2022/02/27 | 488448 | systems/texlive/tlnet/archive/xdvi.amd64-netbsd.r62220.tar.xz
@@ -301147,16 +301151,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
-2023/02/17 | 5829056 | systems/texlive/tlnet/install-tl-unx.tar.gz
-2023/02/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2023/02/17 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/02/18 | 5829130 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/02/18 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/02/18 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2021/04/11 | 4945 | systems/texlive/tlnet/install-tl-windows.bat
-2023/02/17 | 20435231 | systems/texlive/tlnet/install-tl-windows.exe
-2023/02/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
-2023/02/17 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/02/17 | 25513715 | systems/texlive/tlnet/install-tl.zip
-2023/02/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/02/17 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/02/18 | 20436017 | systems/texlive/tlnet/install-tl-windows.exe
+2023/02/18 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/02/18 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/02/18 | 25513700 | systems/texlive/tlnet/install-tl.zip
+2023/02/18 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/02/18 | 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
2023/01/17 | 8401 | systems/texlive/tlnet/tlpkg/gpg/pubring.gpg
@@ -301166,7 +301170,7 @@
2023/01/17 | 1280 | systems/texlive/tlnet/tlpkg/gpg/trustdb.gpg
2023/01/17 | 49938 | systems/texlive/tlnet/tlpkg/installer/config.guess
2010/11/11 | 11651 | systems/texlive/tlnet/tlpkg/installer/COPYING.MinGW-runtime.txt
-2023/02/16 | 7316 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+2023/02/17 | 7242 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/01/11 | 216583 | 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
@@ -301209,12 +301213,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
-2023/02/17 | 18059395 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
-2023/02/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/02/18 | 18060910 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/02/18 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2022/04/18 | 86658 | systems/texlive/tlnet/tlpkg/TeXLive/TLPDB.pm
-2023/02/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
-2023/02/17 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/02/17 | 2449820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/02/18 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/02/18 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/02/18 | 2451496 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2022/09/14 | 58922 | systems/texlive/tlnet/tlpkg/TeXLive/TLPOBJ.pm
2022/10/04 | 42404 | systems/texlive/tlnet/tlpkg/TeXLive/TLPSRC.pm
2021/12/21 | 16130 | systems/texlive/tlnet/tlpkg/TeXLive/TLTREE.pm
@@ -311493,7 +311497,7 @@
2014/07/05 | 611 | systems/win32/yandy/README
2014/07/05 | 1004628 | systems/win32/yandy/yandy-src.tar.xz
2014/07/05 | 1012416 | systems/win32/yandy.zip
-2023/02/18 | 186 | timestamp
+2023/02/19 | 186 | timestamp
2002/08/26 | 61898 | usergrps/dante/antrag.pdf
2002/08/26 | 118217 | usergrps/dante/antrag.ps
2021/11/11 | 917 | usergrps/dante/dtk/doc/beispiel.bib
diff --git a/FILES.byname.gz b/FILES.byname.gz
index b8af31f865..3a650cb500 100644
--- a/FILES.byname.gz
+++ b/FILES.byname.gz
Binary files differ
diff --git a/FILES.last07days b/FILES.last07days
index d9e200c234..9f700329b6 100644
--- a/FILES.last07days
+++ b/FILES.last07days
@@ -1,45 +1,131 @@
+2023/02/18 | 98490 | systems/doc/luatex/luatex-nodes.tex
+2023/02/18 | 9192 | systems/texlive/tlnet/archive/algpseudocodex.r65860.tar.xz
+2023/02/18 | 901082 | macros/generic/soul.zip
+2023/02/18 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
+2023/02/18 | 823 | macros/latex/contrib/zref-clever/README.md
+2023/02/18 | 763743 | macros/latex/contrib/nicematrix/nicematrix.dtx
+2023/02/18 | 762 | macros/generic/soul/README.md
+2023/02/18 | 7624 | graphics/pstricks/contrib/luapstricks/PSTricksDotFont.otf
+2023/02/18 | 727414 | macros/generic/chemfig/chemfig-fr.pdf
+2023/02/18 | 727008 | systems/texlive/tlnet/archive/tangramtikz.doc.r65859.tar.xz
+2023/02/18 | 7144 | graphics/pgf/contrib/pixelart/pixelart.sty
+2023/02/18 | 714456 | macros/generic/chemfig/chemfig-en.pdf
+2023/02/18 | 70 | macros/latex/contrib/zref-clever/DEPENDS.txt
+2023/02/18 | 5829130 | systems/texlive/tlnet/install-tl-unx.tar.gz
+2023/02/18 | 5803 | macros/generic/chemfig/chemfig-lewis.tex
+2023/02/18 | 5445 | macros/latex/contrib/zref-clever/CHANGELOG.md
+2023/02/18 | 527832 | macros/latex/contrib/nicematrix/nicematrix-french.pdf
+2023/02/18 | 523832 | systems/texlive/tlnet/archive/xduts.r65864.tar.xz
+2023/02/18 | 509006 | macros/generic/soul/soul-ori.pdf
+2023/02/18 | 5052 | systems/texlive/tlnet/archive/tangramtikz.r65859.tar.xz
+2023/02/18 | 50127 | systems/doc/luatex/luatex-modifications.tex
+2023/02/18 | 496 | systems/texlive/tlnet/archive/collection-music.r65862.tar.xz
+2023/02/18 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+2023/02/18 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
+2023/02/18 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
+2023/02/18 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
+2023/02/18 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
+2023/02/18 | 44372 | systems/texlive/tlnet/archive/xduts.source.r65864.tar.xz
+2023/02/18 | 424612 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65857.tar.xz
+2023/02/18 | 4050750 | biblio/ctan-bibdata.zip
+2023/02/18 | 397430 | graphics/pgf/contrib/pixelart.zip
+2023/02/18 | 388 | macros/generic/chemfig/chemfig.sty
+2023/02/18 | 377440 | macros/generic/soul/soul.pdf
+2023/02/18 | 3668 | macros/xetex/latex/xduts/README.md
+2023/02/18 | 3660 | systems/texlive/tlnet/archive/recorder-fingering.r65862.tar.xz
+2023/02/18 | 3655354 | biblio/ctan-bibdata/ctan.pdf
+2023/02/18 | 355369 | obsolete/macros/generic/soul.zip
+2023/02/18 | 352491 | macros/latex/contrib/zref-clever/zref-clever.dtx
+2023/02/18 | 352120 | systems/texlive/tlnet/archive/algpseudocodex.doc.r65860.tar.xz
+2023/02/18 | 345913 | macros/latex/contrib/zref-clever/zref-clever.pdf
+2023/02/18 | 3369 | graphics/pstricks/contrib/luapstricks/README.md
+2023/02/18 | 33668 | graphics/pgf/contrib/pixelart/pixelart.tex
+2023/02/18 | 3324 | systems/texlive/tlnet/archive/changelog.r65861.tar.xz
+2023/02/18 | 330063 | macros/xetex/latex/xduts/xduts.pdf
+2023/02/18 | 327672 | systems/texlive/tlnet/archive/xduts.doc.r65864.tar.xz
+2023/02/18 | 31970 | graphics/pstricks/contrib/luapstricks.zip
+2023/02/18 | 3179 | macros/latex/contrib/zref-clever/zref-clever.ins
+2023/02/18 | 3044 | graphics/pgf/contrib/pixelart/pixelart0.sty
+2023/02/18 | 30174 | macros/generic/soul/soul.dtx
+2023/02/18 | 280714 | macros/xetex/latex/xduts/xduts.dtx
+2023/02/18 | 2768178 | biblio/ctan-bibdata/ctan.bib
+2023/02/18 | 2733556 | systems/texlive/tlnet/archive/simpleicons.r65858.tar.xz
+2023/02/18 | 265140 | systems/texlive/tlnet/archive/thmtools.doc.r65863.tar.xz
+2023/02/18 | 25513700 | systems/texlive/tlnet/install-tl.zip
+2023/02/18 | 2451496 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+2023/02/18 | 232668 | graphics/pgf/contrib/pixelart/pixelart.pdf
+2023/02/18 | 20756 | systems/texlive/tlnet/archive/thmtools.source.r65863.tar.xz
+2023/02/18 | 2069523 | systems/doc/luatex.zip
+2023/02/18 | 20436017 | systems/texlive/tlnet/install-tl-windows.exe
+2023/02/18 | 203053 | macros/latex/contrib/nicematrix/nicematrix-french.tex
+2023/02/18 | 2027828 | macros/latex/contrib/nicematrix.zip
+2023/02/18 | 2006600 | systems/texlive/tlnet/archive/simpleicons.doc.r65858.tar.xz
+2023/02/18 | 200523 | macros/generic/chemfig/chemfig-fr.tex
+2023/02/18 | 19106 | graphics/pgf/contrib/pixelart/LICENSE.txt
+2023/02/18 | 1905932 | systems/texlive/tlnet/archive/luatex.doc.r65866.tar.xz
+2023/02/18 | 186018 | macros/generic/chemfig/chemfig-en.tex
+2023/02/18 | 1840 | macros/generic/soul/soul.ins
+2023/02/18 | 18060910 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
+2023/02/18 | 1788486 | systems/doc/luatex/luatex.pdf
+2023/02/18 | 17541 | graphics/pgf/contrib/pixelart/pixelart.lua
+2023/02/18 | 173956 | systems/texlive/tlnet/archive/changelog.doc.r65861.tar.xz
+2023/02/18 | 1685887 | install/macros/latex/contrib/zref-clever.tds.zip
+2023/02/18 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
+2023/02/18 | 1649295 | macros/latex/contrib/zref-clever.zip
+2023/02/18 | 1565314 | macros/generic/chemfig.zip
+2023/02/18 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
+2023/02/18 | 1539 | macros/latex/contrib/zref-clever/zref-clever-code.tex
+2023/02/18 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
+2023/02/18 | 152529 | graphics/pgf/contrib/pixelart/pixelart0.pdf
+2023/02/18 | 15144 | graphics/pgf/contrib/pixelart/pixelart0.tex
+2023/02/18 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
+2023/02/18 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+2023/02/18 | 13416 | systems/texlive/tlnet/archive/thmtools.r65863.tar.xz
+2023/02/18 | 1339763 | macros/latex/contrib/nicematrix/nicematrix.pdf
+2023/02/18 | 133473 | macros/generic/soul/soul-ori.dtx
+2023/02/18 | 132439 | graphics/pstricks/contrib/luapstricks/luapstricks.lua
+2023/02/18 | 130652 | systems/texlive/tlnet/archive/recorder-fingering.doc.r65862.tar.xz
+2023/02/18 | 128822 | macros/latex/contrib/zref-clever/zref-clever.tex
+2023/02/18 | 12832 | systems/texlive/tlnet/archive/luatex.r65866.tar.xz
+2023/02/18 | 1281092 | macros/latex/contrib/zref-clever/zref-clever-code.pdf
+2023/02/18 | 1261090 | macros/xetex/latex/xduts.zip
+2023/02/18 | 1246 | graphics/pgf/contrib/pixelart/CHANGELOG.md
+2023/02/18 | 121813 | macros/generic/chemfig/chemfig.tex
+2023/02/18 | 1188 | macros/xetex/latex/xduts/xduts.ins
+2023/02/18 | 113796 | systems/texlive/tlnet/archive/texlive-scripts.r65857.tar.xz
+2023/02/18 | 1125 | macros/generic/chemfig/README
+2023/02/18 | 1049 | graphics/pgf/contrib/pixelart/README.md
2023/02/17 | 997288 | systems/texlive/tlnet/archive/postnotes.doc.r65854.tar.xz
2023/02/17 | 950 | macros/latex/contrib/thmtools/source/thmdef-mdframed.dtx
-2023/02/17 | 881135 | macros/xetex/latex/xduts/xdulogo.pdf
2023/02/17 | 866535 | graphics/pgf/contrib/tangramtikz.zip
2023/02/17 | 8580 | macros/latex/contrib/thmtools/source/thm-patch.dtx
2023/02/17 | 7911 | macros/latex/contrib/thmtools/source/thm-listof.dtx
2023/02/17 | 744556 | systems/texlive/tlnet/archive/l3build.doc.r65852.tar.xz
2023/02/17 | 736 | macros/latex/contrib/thmtools/README.md
2023/02/17 | 728 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsOneZero.tfm
+2023/02/17 | 7242 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/02/17 | 7224 | systems/texlive/tlnet/archive/postnotes.r65854.tar.xz
2023/02/17 | 68489 | macros/latex/contrib/recorder-fingering/recorder-fingering.pdf
2023/02/17 | 665 | fonts/simpleicons/README.md
2023/02/17 | 65144 | macros/latex/contrib/recorder-fingering/RecorderInCchart.png
-2023/02/17 | 5829056 | systems/texlive/tlnet/install-tl-unx.tar.gz
2023/02/17 | 5639 | macros/latex/contrib/thmtools/source/unique.dtx
2023/02/17 | 551392 | systems/texlive/tlnet/archive/overarrows.doc.r65853.tar.xz
2023/02/17 | 54725 | macros/latex/contrib/changelog/changelog.pdf
2023/02/17 | 5392 | systems/texlive/tlnet/archive/overarrows.r65853.tar.xz
2023/02/17 | 5360 | systems/texlive/tlnet/archive/pyluatex.r65855.tar.xz
2023/02/17 | 4986007 | fonts/simpleicons.zip
-2023/02/17 | 48 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
2023/02/17 | 4679 | macros/latex/contrib/thmtools/source/thm-amsthm.dtx
-2023/02/17 | 455 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
-2023/02/17 | 455 | systems/texlive/tlnet/install-tl.zip.sha512.asc
-2023/02/17 | 455 | systems/texlive/tlnet/install-tl-windows.exe.sha512.asc
-2023/02/17 | 455 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512.asc
2023/02/17 | 4534 | macros/latex/contrib/thmtools/source/thmdef-shaded.dtx
2023/02/17 | 44577 | macros/latex/contrib/thmtools/doc/thmtools-manual.tex
2023/02/17 | 4454 | macros/latex/contrib/thmtools/source/aliasctr.dtx
2023/02/17 | 442183 | graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.pdf
2023/02/17 | 440966 | graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-fr.pdf
-2023/02/17 | 424612 | systems/texlive/tlnet/archive/texlive-scripts.doc.r65850.tar.xz
2023/02/17 | 40709 | macros/latex/contrib/algpseudocodex/algpseudocodex.sty
-2023/02/17 | 4049088 | biblio/ctan-bibdata.zip
2023/02/17 | 40050 | graphics/pgf/contrib/tangramtikz/tex/TangramTikz.sty
-2023/02/17 | 3668 | macros/xetex/latex/xduts/README.md
-2023/02/17 | 3652922 | biblio/ctan-bibdata/ctan.pdf
2023/02/17 | 360801 | macros/latex/contrib/algpseudocodex.zip
2023/02/17 | 35860 | systems/texlive/tlnet/archive/l3build.r65852.tar.xz
2023/02/17 | 356253 | macros/latex/contrib/algpseudocodex/algpseudocodex.pdf
2023/02/17 | 3526 | macros/latex/contrib/thmtools/source/thm-ntheorem.dtx
-2023/02/17 | 330023 | macros/xetex/latex/xduts/xduts.pdf
2023/02/17 | 3240 | macros/latex/contrib/thmtools/source/thm-autoref.dtx
2023/02/17 | 31 | macros/latex/contrib/thmtools/source/VERSION.tex
2023/02/17 | 30996 | systems/texlive/tlnet/archive/l3build.source.r65852.tar.xz
@@ -47,9 +133,7 @@
2023/02/17 | 2928 | systems/texlive/tlnet/archive/annotate-equations.r65851.tar.xz
2023/02/17 | 284 | macros/latex/contrib/recorder-fingering/README.md
2023/02/17 | 2840 | fonts/simpleicons/enc/simpleiconsOne.enc
-2023/02/17 | 280443 | macros/xetex/latex/xduts/xduts.dtx
2023/02/17 | 2779 | macros/latex/contrib/thmtools/source/thm-llncs.dtx
-2023/02/17 | 2767751 | biblio/ctan-bibdata/ctan.bib
2023/02/17 | 274 | fonts/simpleicons/tex/usimpleiconsOneZero.fd
2023/02/17 | 2744 | fonts/simpleicons/enc/simpleiconsFour.enc
2023/02/17 | 2710 | fonts/simpleicons/enc/simpleiconsEight.enc
@@ -62,7 +146,6 @@
2023/02/17 | 259 | fonts/simpleicons/tex/usimpleiconsFour.fd
2023/02/17 | 259 | fonts/simpleicons/tex/usimpleiconsFive.fd
2023/02/17 | 2584 | fonts/simpleicons/enc/simpleiconsSeven.enc
-2023/02/17 | 25513715 | systems/texlive/tlnet/install-tl.zip
2023/02/17 | 254 | fonts/simpleicons/tex/usimpleiconsTwo.fd
2023/02/17 | 254 | fonts/simpleicons/tex/usimpleiconsSix.fd
2023/02/17 | 254 | fonts/simpleicons/tex/usimpleiconsOne.fd
@@ -71,7 +154,6 @@
2023/02/17 | 2500 | macros/latex/contrib/thmtools/source/thmtools.ins
2023/02/17 | 2469 | fonts/simpleicons/enc/simpleiconsFive.enc
2023/02/17 | 2465 | fonts/simpleicons/enc/simpleiconsThree.enc
-2023/02/17 | 2449820 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
2023/02/17 | 24260 | systems/texlive/tlnet/archive/overarrows.source.r65853.tar.xz
2023/02/17 | 2407 | fonts/simpleicons/enc/simpleiconsOneZero.enc
2023/02/17 | 218691 | fonts/simpleicons/tex/simpleiconsglyphs-pdftex.tex
@@ -81,7 +163,6 @@
2023/02/17 | 2117 | macros/latex/contrib/thmtools/source/thmtools.dtx
2023/02/17 | 208144 | systems/texlive/tlnet/archive/annotate-equations.doc.r65851.tar.xz
2023/02/17 | 2046 | macros/latex/contrib/thmtools/source/parseargs.dtx
-2023/02/17 | 20435231 | systems/texlive/tlnet/install-tl-windows.exe
2023/02/17 | 20153 | macros/latex/contrib/algpseudocodex/algpseudocodex.tex
2023/02/17 | 20036 | graphics/pgf/contrib/tangramtikz/doc/TangramTikz-doc-en.tex
2023/02/17 | 1996939 | fonts/simpleicons/doc/simpleicons.pdf
@@ -91,24 +172,17 @@
2023/02/17 | 185881 | macros/latex/contrib/changelog.zip
2023/02/17 | 1844 | fonts/simpleicons/doc/simpleicons.tex
2023/02/17 | 1841 | macros/latex/contrib/thmtools/doc/changes.txt
-2023/02/17 | 18059395 | systems/texlive/tlnet/tlpkg/texlive.tlpdb
2023/02/17 | 1764994 | fonts/simpleicons/type1/SimpleIcons.pfb
2023/02/17 | 17624 | macros/latex/contrib/changelog/example.pdf
2023/02/17 | 1732 | macros/latex/contrib/thmtools/source/thmdef-thmbox.dtx
-2023/02/17 | 1678 | biblio/ctan-bibdata/biblatex-ctan/ctan.bbx
2023/02/17 | 16451 | macros/latex/contrib/thmtools/source/thm-kv.dtx
2023/02/17 | 1557 | fonts/simpleicons/tex/simpleicons.sty
-2023/02/17 | 153 | systems/texlive/tlnet/install-tl-windows.exe.sha512
2023/02/17 | 1531 | macros/latex/contrib/thmtools/source/thm-beamer.dtx
-2023/02/17 | 152 | systems/texlive/tlnet/install-tl-unx.tar.gz.sha512
-2023/02/17 | 145 | systems/texlive/tlnet/install-tl.zip.sha512
-2023/02/17 | 144 | systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
2023/02/17 | 13882 | macros/latex/contrib/changelog/changelog.tex
2023/02/17 | 1346 | macros/latex/contrib/changelog/README.md
2023/02/17 | 134256 | macros/latex/contrib/recorder-fingering.zip
2023/02/17 | 1315 | macros/latex/contrib/changelog/example.tex
2023/02/17 | 129714 | fonts/simpleicons/doc/bindings.tex
-2023/02/17 | 1261336 | macros/xetex/latex/xduts.zip
2023/02/17 | 1236 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsSeven.tfm
2023/02/17 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsTwo.tfm
2023/02/17 | 1232 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsThree.tfm
@@ -120,8 +194,6 @@
2023/02/17 | 1228 | fonts/simpleicons/tfm/SimpleIcons--simpleiconsOne.tfm
2023/02/17 | 12064 | macros/latex/contrib/thmtools/source/thm-restate.dtx
2023/02/17 | 12061 | macros/latex/contrib/changelog/changelog.sty
-2023/02/17 | 1188 | macros/xetex/latex/xduts/xduts.ins
-2023/02/17 | 113820 | systems/texlive/tlnet/archive/texlive-scripts.r65850.tar.xz
2023/02/17 | 1119 | fonts/simpleicons/map/simpleicons.map
2023/02/17 | 11176 | macros/latex/contrib/recorder-fingering/recorder-fingering.sty
2023/02/17 | 108064 | macros/latex/contrib/changelog/screenshot.png
@@ -137,7 +209,6 @@
2023/02/16 | 7756 | macros/latex/contrib/l3build/l3build-arguments.lua
2023/02/16 | 75720 | systems/texlive/tlnet/archive/pdfmanagement-testphase.r65844.tar.xz
2023/02/16 | 742232 | macros/latex/contrib/l3build/l3build.pdf
-2023/02/16 | 7316 | systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
2023/02/16 | 7206 | macros/latex/contrib/l3build/l3build-manifest.lua
2023/02/16 | 6693 | macros/latex/contrib/l3build/l3build-typesetting.lua
2023/02/16 | 6552 | macros/latex/contrib/l3build/l3build.lua
@@ -535,7 +606,6 @@
2023/02/13 | 920892 | macros/latex/required/babel/base/babel.pdf
2023/02/13 | 870 | macros/latex/contrib/hagenberg-thesis/latex/hgbmath.sty
2023/02/13 | 848447 | macros/latex/required/babel/base/locale.zip
-2023/02/13 | 823 | macros/latex/contrib/zref-clever/README.md
2023/02/13 | 797312 | systems/texlive/tlnet/archive/jsclasses.doc.r65801.tar.xz
2023/02/13 | 7869 | macros/latex/required/babel/base/babel.ins
2023/02/13 | 77465 | support/epspdf/epspdf.tlu
@@ -543,13 +613,11 @@
2023/02/13 | 7398 | macros/latex/contrib/hagenberg-thesis/latex/hgbbib.sty
2023/02/13 | 735 | support/epspdf/README
2023/02/13 | 716427 | graphics/pstricks/contrib/pst-poker/doc/pst-poker-doc.pdf
-2023/02/13 | 70 | macros/latex/contrib/zref-clever/DEPENDS.txt
2023/02/13 | 698 | macros/latex/contrib/hagenberg-thesis/README.md
2023/02/13 | 60727 | macros/unicodetex/latex/tipauni/tipauni.dtx
2023/02/13 | 603887 | macros/latex/contrib/nicefilelist/doc/nicefilelist.pdf
2023/02/13 | 57012 | systems/texlive/tlnet/archive/jsclasses.source.r65801.tar.xz
2023/02/13 | 565 | macros/latex/contrib/nicefilelist/doc/nicefilelist.RLS
-2023/02/13 | 5264 | macros/latex/contrib/zref-clever/CHANGELOG.md
2023/02/13 | 5100 | biblio/bibtex/utils/bibcop/bibcop-logo.pdf
2023/02/13 | 50 | macros/latex/contrib/nicefilelist/source/wrong.prv
2023/02/13 | 4846688 | systems/texlive/tlnet/archive/tcolorbox.doc.r65800.tar.xz
@@ -569,11 +637,8 @@
2023/02/13 | 358424 | systems/texlive/tlnet/archive/pxpic.doc.r65803.tar.xz
2023/02/13 | 3551480 | macros/latex/contrib/hagenberg-thesis.zip
2023/02/13 | 3526 | macros/latex/required/babel/base/bbidxglo.dtx
-2023/02/13 | 352491 | macros/latex/contrib/zref-clever/zref-clever.dtx
-2023/02/13 | 345898 | macros/latex/contrib/zref-clever/zref-clever.pdf
2023/02/13 | 343290 | biblio/bibtex/utils/bibcop/bibcop.pdf
2023/02/13 | 3196 | systems/texlive/tlnet/archive/pxpic.r65803.tar.xz
-2023/02/13 | 3179 | macros/latex/contrib/zref-clever/zref-clever.ins
2023/02/13 | 311090 | macros/unicodetex/latex/tipauni.zip
2023/02/13 | 310331 | macros/unicodetex/latex/tipauni/tipauni.pdf
2023/02/13 | 3078164 | install/macros/latex/required/babel-base.tds.zip
@@ -608,12 +673,9 @@
2023/02/13 | 1848 | macros/latex/contrib/hagenberg-thesis/latex/hgbabbrev.sty
2023/02/13 | 17158 | macros/luatex/generic/evangelion-jfm/jfm-eva.lua
2023/02/13 | 1700 | macros/unicodetex/latex/tipauni/tipauni.ins
-2023/02/13 | 1685007 | install/macros/latex/contrib/zref-clever.tds.zip
2023/02/13 | 16576 | macros/latex/contrib/hagenberg-thesis/latex/hgbthesis.cls
-2023/02/13 | 1648421 | macros/latex/contrib/zref-clever.zip
2023/02/13 | 159984 | systems/texlive/tlnet/archive/uptex-base.doc.r65802.tar.xz
2023/02/13 | 154061 | macros/latex/contrib/resolsysteme/doc/ResolSysteme-exemples.pdf
-2023/02/13 | 1539 | macros/latex/contrib/zref-clever/zref-clever-code.tex
2023/02/13 | 15329 | macros/luatex/generic/evangelion-jfm/Evangelion-doc.tex
2023/02/13 | 15020 | systems/texlive/tlnet/archive/pxpic.source.r65803.tar.xz
2023/02/13 | 14488 | macros/latex/contrib/hagenberg-thesis/doc/hagenberg-thesis.tex
@@ -622,8 +684,6 @@
2023/02/13 | 14239 | biblio/bibtex/utils/bibcop/bibcop.dtx
2023/02/13 | 136384 | systems/texlive/tlnet/archive/tex4ht.doc.r65804.tar.xz
2023/02/13 | 1355 | macros/luatex/generic/evangelion-jfm/README.md
-2023/02/13 | 128670 | macros/latex/contrib/zref-clever/zref-clever.tex
-2023/02/13 | 1280514 | macros/latex/contrib/zref-clever/zref-clever-code.pdf
2023/02/13 | 126724 | macros/latex/contrib/resolsysteme/doc/ResolSysteme-exemples-pyluatex.pdf
2023/02/13 | 1225 | macros/latex/contrib/nicefilelist/source/srcfiles.tex
2023/02/13 | 12081 | macros/latex/contrib/hagenberg-thesis/latex/hgb.sty
@@ -657,7 +717,6 @@
2023/02/12 | 77479 | macros/jptex/latex/jsclasses/jsverb.pdf
2023/02/12 | 76829 | macros/latex/contrib/tcolorbox/goldshade.png
2023/02/12 | 7641872 | macros/latex/contrib/tcolorbox/tcolorbox.pdf
-2023/02/12 | 736 | graphics/pxpic/pxpic-parrot.csv
2023/02/12 | 722828 | systems/texlive/tlnet/archive/polyglossia.doc.r65792.tar.xz
2023/02/12 | 6691 | macros/latex/contrib/tcolorbox/tcolorbox.doc.s_snippet.sty
2023/02/12 | 6686 | macros/latex/contrib/tcolorbox/tcolorbox.doc.bib
@@ -679,17 +738,14 @@
2023/02/12 | 5632 | macros/latex/contrib/tcolorbox/tcbmagazine.code.tex
2023/02/12 | 561 | macros/jptex/latex/jsclasses/jsclasses.ins
2023/02/12 | 5577 | macros/latex/contrib/tcolorbox/tcolorbox.doc.quickref.tex
-2023/02/12 | 54771 | graphics/pxpic/pxpic.dtx
2023/02/12 | 5404 | macros/latex/contrib/tcolorbox/tcolorbox.doc.abstract.tex
2023/02/12 | 5390 | macros/latex/contrib/resolsysteme/doc/ResolSysteme-exemples.tex
-2023/02/12 | 523820 | systems/texlive/tlnet/archive/xduts.r65794.tar.xz
2023/02/12 | 5086 | macros/latex/contrib/tcolorbox/tcolorbox.doc.filling.tex
2023/02/12 | 5048 | macros/latex/contrib/tcolorbox/README.md
2023/02/12 | 5031 | macros/latex/contrib/tcolorbox/tcolorbox.doc.verbatim.tex
2023/02/12 | 469022 | macros/latex/contrib/tcolorbox/tcolorbox-example.pdf
2023/02/12 | 455822 | macros/latex/contrib/tcolorbox/tcolorbox-tutorial-poster.pdf
2023/02/12 | 446 | macros/jptex/generic/uptex-base/README.md
-2023/02/12 | 44308 | systems/texlive/tlnet/archive/xduts.source.r65794.tar.xz
2023/02/12 | 44098 | macros/latex/contrib/tcolorbox/tcolorbox-tutorial-poster.tex
2023/02/12 | 415344 | macros/jptex/latex/jsclasses/jsclasses.pdf
2023/02/12 | 41487 | macros/latex/contrib/tcolorbox/tcolorbox.doc.theorems.tex
@@ -697,7 +753,6 @@
2023/02/12 | 40183 | macros/latex/contrib/tcolorbox/tcolorbox.doc.breakable.tex
2023/02/12 | 373377 | graphics/pxpic.zip
2023/02/12 | 3720 | macros/unicodetex/latex/bithesis/bithesis.ins
-2023/02/12 | 367537 | graphics/pxpic/pxpic.pdf
2023/02/12 | 35224 | macros/latex/contrib/tcolorbox/lichtspiel.jpg
2023/02/12 | 3494 | macros/latex/contrib/tcolorbox/tcolorbox.tex
2023/02/12 | 3414 | macros/latex/contrib/tcolorbox/tcblistings.code.tex
@@ -705,7 +760,6 @@
2023/02/12 | 338387 | macros/jptex/generic/uptex-base.zip
2023/02/12 | 3363 | macros/latex/contrib/tcolorbox/tcbminted.code.tex
2023/02/12 | 33131 | macros/latex/contrib/tcolorbox/tcolorbox.doc.raster.tex
-2023/02/12 | 327600 | systems/texlive/tlnet/archive/xduts.doc.r65794.tar.xz
2023/02/12 | 3263832 | systems/texlive/tlnet/archive/luatexja.doc.r65790.tar.xz
2023/02/12 | 31235 | macros/latex/contrib/tcolorbox/tcbdocumentation.code.tex
2023/02/12 | 29872 | macros/latex/contrib/tcolorbox/tcolorbox.doc.technical.tex
@@ -762,7 +816,6 @@
2023/02/12 | 122096 | systems/texlive/tlnet/archive/polyglossia.r65792.tar.xz
2023/02/12 | 11805 | macros/latex/contrib/tcolorbox/tcolorbox.doc.s_main.sty
2023/02/12 | 1153481 | support/TeX4ht/source/tex4ht-4ht.tex
-2023/02/12 | 1149 | graphics/pxpic/README.md
2023/02/12 | 11344 | macros/jptex/latex/jsclasses/jslogo.dtx
2023/02/12 | 113062 | macros/latex/contrib/tcolorbox/tcolorbox.doc.skins.tex
2023/02/12 | 112 | macros/latex/contrib/tcolorbox/tcolorbox.doc.index.tex
@@ -771,216 +824,3 @@
2023/02/12 | 1084 | systems/texlive/tlnet/archive/tidyres.r65789.tar.xz
2023/02/12 | 1067361 | macros/unicodetex/latex/bithesis/bithesis.pdf
2023/02/12 | 10040 | macros/latex/contrib/tcolorbox/tcbskinsjigsaw.code.tex
-2023/02/11 | 992 | language/bengali/bangla/README
-2023/02/11 | 9804 | graphics/pgf/contrib/circuitikz/tex/pgfcircflow.tex
-2023/02/11 | 9538 | graphics/pgf/contrib/circuitikz/tex/pgfcirccurrent.tex
-2023/02/11 | 945 | macros/luatex/generic/luatexja/tool/table_ivd_aj1.lua
-2023/02/11 | 945 | macros/luatex/generic/luatexja/doc/jfm-testf.lua
-2023/02/11 | 938 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.tex
-2023/02/11 | 937130 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2-body.tex
-2023/02/11 | 929934 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.1.2.tex
-2023/02/11 | 896 | macros/luatex/generic/luatexja/tool/otf-KozMinPr6N-Regular.txt
-2023/02/11 | 885 | macros/luatex/generic/luatexja/src/patches/lltjp-stfloats.sty
-2023/02/11 | 875 | support/pmx/doc/pmxab.1
-2023/02/11 | 8695 | macros/luatex/generic/luatexja/src/ltj-otf.lua
-2023/02/11 | 8660 | macros/luatex/generic/luatexja/src/ltjltxdoc.dtx
-2023/02/11 | 8445 | graphics/pgf/contrib/circuitikz/doc/ctikzmanutils.sty
-2023/02/11 | 841340 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0-body.tex
-2023/02/11 | 84002 | graphics/pgf/contrib/circuitikz/tex/pgfcircquadpoles.tex
-2023/02/11 | 834142 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.0.tex
-2023/02/11 | 825 | macros/luatex/generic/luatexja/src/patches/lltjp-collcell.sty
-2023/02/11 | 812183 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.pdf
-2023/02/11 | 8103 | macros/luatex/generic/luatexja/src/jfm-min.lua
-2023/02/11 | 807 | support/pmx/doc/scor2prt.1
-2023/02/11 | 7966 | macros/latex/contrib/codehigh/codehigh.tex
-2023/02/11 | 790136 | systems/texlive/tlnet/archive/authorarchive.doc.r65777.tar.xz
-2023/02/11 | 790036 | support/pmx/source/pmx-3.0.0.tar.gz
-2023/02/11 | 7802 | language/bengali/bangla/bangla.tex
-2023/02/11 | 7790 | macros/luatex/generic/luatexja/tool/jfm-convert.lua
-2023/02/11 | 778 | macros/latex/contrib/tidyres/README.md
-2023/02/11 | 7691 | macros/luatex/generic/luatexja/src/ltj-unicode-ccfix.lua
-2023/02/11 | 758991 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6-body.tex
-2023/02/11 | 7546 | macros/luatex/generic/luatexja/src/ltj-math.lua
-2023/02/11 | 751663 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.6.tex
-2023/02/11 | 72965 | language/bengali/bangla/bangla.pdf
-2023/02/11 | 728 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4.sty
-2023/02/11 | 717552 | macros/luatex/generic/luatexja/doc/luatexja-en.pdf
-2023/02/11 | 71540 | support/pmx/doc/gapxmpl.eps
-2023/02/11 | 7108 | systems/texlive/tlnet/archive/eolang.r65778.tar.xz
-2023/02/11 | 7042 | macros/luatex/generic/luatexja/src/ltj-pretreat.lua
-2023/02/11 | 6922 | macros/luatex/generic/luatexja/src/addons/luatexja-otf.sty
-2023/02/11 | 69217 | macros/luatex/generic/luatexja/doc/ltjltxdoc.pdf
-2023/02/11 | 690729 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3-body.tex
-2023/02/11 | 688 | support/pmx/README
-2023/02/11 | 683433 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.9.3.tex
-2023/02/11 | 65925 | support/pmx/doc/accents.eps
-2023/02/11 | 6571 | macros/luatex/generic/luatexja/src/ltj-latex.sty
-2023/02/11 | 6529 | macros/luatex/generic/luatexja/src/patches/lltjdefs.sty
-2023/02/11 | 641 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3.sty
-2023/02/11 | 635 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7.sty
-2023/02/11 | 635 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6.sty
-2023/02/11 | 633 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.6.sty
-2023/02/11 | 632 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7.sty
-2023/02/11 | 632 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.1.2.sty
-2023/02/11 | 632 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.9.3.sty
-2023/02/11 | 631 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6.sty
-2023/02/11 | 626 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.0.sty
-2023/02/11 | 6246 | macros/luatex/generic/luatexja/src/ltj-base.sty
-2023/02/11 | 617 | macros/luatex/generic/luatexja/src/patches/lltjp-array.sty
-2023/02/11 | 6135 | macros/luatex/generic/luatexja/src/patches/lltjp-tascmac.sty
-2023/02/11 | 6060 | macros/luatex/generic/luatexja/tool/kyoikukanjiChars.tex
-2023/02/11 | 59351 | support/pmx/doc/sjb291.eps
-2023/02/11 | 5931 | macros/luatex/generic/luatexja/src/ltj-lotf_aux.lua
-2023/02/11 | 5918 | macros/latex/contrib/tidyres/tidyres-doc.tex
-2023/02/11 | 5850 | macros/luatex/generic/luatexja/src/patches/lltjp-fontspec.sty
-2023/02/11 | 58140 | macros/luatex/generic/luatexja/doc/luatexja-ruby.tex
-2023/02/11 | 580 | macros/luatex/generic/luatexja/tool/blocks2defcharrange.rb
-2023/02/11 | 57153 | graphics/pgf/contrib/circuitikz/tex/pgfcircmonopoles.tex
-2023/02/11 | 570225 | macros/unicodetex/latex/polyglossia.zip
-2023/02/11 | 55583 | support/pmx/doc/tremxmpl4.eps
-2023/02/11 | 55401 | macros/luatex/generic/luatexja/src/ltj-jfmglue.lua
-2023/02/11 | 551 | macros/luatex/generic/luatexja/tool/jfm-readable.rb
-2023/02/11 | 54427 | macros/luatex/generic/luatexja/src/ltj-jisx0208.lua
-2023/02/11 | 543528 | macros/luatex/generic/luatexja/doc/luatexja.dtx
-2023/02/11 | 5302 | macros/luatex/generic/luatexja/src/addons/luatexja-adjust.sty
-2023/02/11 | 529 | macros/latex/contrib/proflycee/doc/testscript.py
-2023/02/11 | 525395 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.tex
-2023/02/11 | 5215 | macros/luatex/generic/luatexja/src/ltj-debug.lua
-2023/02/11 | 5064 | graphics/pgf/contrib/circuitikz/README.md
-2023/02/11 | 49558 | macros/luatex/generic/luatexja/src/patches/lltjfont.sty
-2023/02/11 | 48819 | graphics/pgf/contrib/circuitikz/doc/changelog.tex
-2023/02/11 | 4808 | macros/luatex/generic/luatexja/src/jfm-tmin.lua
-2023/02/11 | 48082 | macros/luatex/generic/luatexja/src/ltj-jfont.lua
-2023/02/11 | 460413 | macros/luatex/generic/luatexja/doc/ltjsclasses.pdf
-2023/02/11 | 4521 | macros/luatex/generic/luatexja/src/ltj-stack.lua
-2023/02/11 | 4480 | macros/luatex/generic/luatexja/src/ltj-plain.sty
-2023/02/11 | 4452 | macros/luatex/generic/luatexja/doc/jfm-ujisc33.lua
-2023/02/11 | 4308 | macros/luatex/generic/luatexja/src/patches/lltjp-atbegshi.sty
-2023/02/11 | 4262 | macros/luatex/generic/luatexja/tool/kyoikukanji.txt
-2023/02/11 | 425 | macros/luatex/generic/luatexja/src/patches/lltjp-everyshi.sty
-2023/02/11 | 422295 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.8.3-body.tex
-2023/02/11 | 4215 | macros/luatex/generic/luatexja/src/ltj-charrange.lua
-2023/02/11 | 418 | graphics/pgf/contrib/circuitikz/doc/compatibility.tex
-2023/02/11 | 416850 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-0.8.3.tex
-2023/02/11 | 41491 | graphics/pgf/contrib/circuitikz/tex/pgfcirc.defines.tex
-2023/02/11 | 4126 | macros/luatex/generic/luatexja/src/patches/lltjp-siunitx.sty
-2023/02/11 | 40574 | macros/luatex/generic/luatexja/src/ltj-direction.lua
-2023/02/11 | 403681 | macros/luatex/generic/luatexja/doc/ltjclasses.pdf
-2023/02/11 | 403567 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.7-body.tex
-2023/02/11 | 397995 | macros/xetex/latex/langsci.zip
-2023/02/11 | 393884 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.6-body.tex
-2023/02/11 | 391556 | macros/luatex/generic/luatexja/doc/luatexja-ruby.pdf
-2023/02/11 | 3879 | macros/luatex/generic/luatexja/src/ltj-lineskip.lua
-2023/02/11 | 385 | macros/luatex/generic/luatexja/src/ltjsclasses.ins
-2023/02/11 | 3847844 | macros/luatex/generic/luatexja.zip
-2023/02/11 | 381107 | graphics/pgf/contrib/circuitikz/tex/pgfcirctripoles.tex
-2023/02/11 | 3797 | macros/luatex/generic/luatexja/README
-2023/02/11 | 3756 | macros/luatex/generic/luatexja/src/ltj-compat.lua
-2023/02/11 | 3704 | systems/texlive/tlnet/archive/authorarchive.r65777.tar.xz
-2023/02/11 | 364117 | graphics/pgf/contrib/circuitikz/tex/circuitikz-0.4-body.tex
-2023/02/11 | 3590 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz.tex
-2023/02/11 | 355 | macros/luatex/generic/luatexja/tool/otf-AdobeMingStd-Light.txt
-2023/02/11 | 355 | macros/luatex/generic/luatexja/doc/luatexja.ins
-2023/02/11 | 35438 | graphics/pgf/contrib/circuitikz/tex/pgfcircvoltage.tex
-2023/02/11 | 352828 | macros/unicodetex/latex/polyglossia/polyglossia.pdf
-2023/02/11 | 351171 | language/bengali/bangla.zip
-2023/02/11 | 3504 | systems/texlive/tlnet/archive/mismath.r65779.tar.xz
-2023/02/11 | 3451 | macros/luatex/generic/luatexja/src/luatexja-compat.sty
-2023/02/11 | 3429 | macros/luatex/generic/luatexja/src/ltj-inputbuf.lua
-2023/02/11 | 3371 | macros/luatex/generic/luatexja/src/patches/lltjp-xunicode.sty
-2023/02/11 | 33461 | macros/luatex/generic/luatexja/src/addons/luatexja-ajmacros.sty
-2023/02/11 | 33313 | graphics/pgf/contrib/circuitikz/tex/pgfcircshapes.tex
-2023/02/11 | 3313 | macros/luatex/generic/luatexja/tool/ltj-unicode-ccfix_make2.pl
-2023/02/11 | 33032 | support/pmx/doc/ChangeLog
-2023/02/11 | 3275120 | install/graphics/pgf/contrib/circuitikz.tds.zip
-2023/02/11 | 326 | macros/luatex/generic/luatexja/tool/otf-AdobeMyungjoStd-Medium.txt
-2023/02/11 | 3254944 | graphics/pgf/contrib/circuitikz.zip
-2023/02/11 | 32473 | support/pmx/doc/gpl.txt
-2023/02/11 | 3238 | macros/luatex/generic/luatexja/doc/jfm-test.lua
-2023/02/11 | 32227 | macros/luatex/generic/luatexja/src/ltj-ruby.lua
-2023/02/11 | 317 | macros/luatex/generic/luatexja/tool/otf-AdobeSongStd-Light.txt
-2023/02/11 | 3150 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-legacy.tex
-2023/02/11 | 31048 | support/pmx/tex/pmx.tex
-2023/02/11 | 3100 | macros/luatex/generic/luatexja/tool/table_jisx0208.tex
-2023/02/11 | 29835 | macros/luatex/generic/luatexja/src/luatexja-core.sty
-2023/02/11 | 29612 | macros/luatex/generic/luatexja/src/addons/luatexja-preset.sty
-2023/02/11 | 287228 | graphics/pgf/contrib/circuitikz/tex/pgfcircbipoles.tex
-2023/02/11 | 280 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-example.tex
-2023/02/11 | 27058 | macros/luatex/generic/luatexja/src/lltjext.sty
-2023/02/11 | 2599 | macros/luatex/generic/luatexja/src/jfm-banjiao.lua
-2023/02/11 | 2582 | macros/luatex/generic/luatexja/src/jfm-kaiming.lua
-2023/02/11 | 2573 | macros/luatex/generic/luatexja/src/jfm-quanjiao.lua
-2023/02/11 | 24171 | support/pmx/doc/ref300.tex
-2023/02/11 | 237569 | macros/latex/contrib/proflycee/doc/ProfLycee-doc.tex
-2023/02/11 | 2374 | macros/luatex/generic/luatexja/src/patches/lltjp-unicode-math.sty
-2023/02/11 | 2340 | macros/luatex/generic/luatexja/src/jfm-jis.lua
-2023/02/11 | 233520 | systems/texlive/tlnet/archive/mismath.doc.r65779.tar.xz
-2023/02/11 | 2307387 | support/pmx.zip
-2023/02/11 | 22800 | macros/latex/contrib/codehigh/codehigh.sty
-2023/02/11 | 22125 | macros/luatex/generic/luatexja/src/ltj-adjust.lua
-2023/02/11 | 22102 | macros/luatex/generic/luatexja/src/luatexja.lua
-2023/02/11 | 2203 | macros/luatex/generic/luatexja/src/jfm-CCT.lua
-2023/02/11 | 2193 | macros/luatex/generic/luatexja/src/addons/luatexja-zhfonts.sty
-2023/02/11 | 2188 | graphics/pgf/contrib/circuitikz/tex/ctikzstyle-romano.tex
-2023/02/11 | 211638 | macros/latex/contrib/tidyres/tidyres-doc.pdf
-2023/02/11 | 2057 | macros/luatex/generic/luatexja/src/patches/lltjp-microtype.sty
-2023/02/11 | 2042 | macros/luatex/generic/luatexja/src/luatexja.sty
-2023/02/11 | 200 | macros/luatex/generic/luatexja/src/jfm-prop.lua
-2023/02/11 | 196 | macros/luatex/generic/luatexja/src/jfm-propw.lua
-2023/02/11 | 196 | macros/luatex/generic/luatexja/src/jfm-propv.lua
-2023/02/11 | 1942 | macros/unicodetex/latex/polyglossia/README.md
-2023/02/11 | 193749 | macros/latex/contrib/tidyres.zip
-2023/02/11 | 192 | macros/luatex/generic/luatexja/src/jfm-mono.lua
-2023/02/11 | 19234 | macros/luatex/generic/luatexja/src/patches/lltjp-geometry.sty
-2023/02/11 | 189 | macros/luatex/generic/luatexja/src/patches/lltjp-preview.sty
-2023/02/11 | 189539 | macros/luatex/generic/luatexja/src/ltjsclasses.dtx
-2023/02/11 | 18722 | macros/luatex/generic/luatexja/src/ltj-kinsoku.tex
-2023/02/11 | 18468 | systems/texlive/tlnet/archive/mismath.source.r65779.tar.xz
-2023/02/11 | 178115 | macros/luatex/generic/luatexja/src/ltjclasses.dtx
-2023/02/11 | 1767300 | macros/latex/contrib/proflycee.zip
-2023/02/11 | 17645 | graphics/pgf/contrib/circuitikz/doc/circuitikz-context.pdf
-2023/02/11 | 1740 | macros/luatex/generic/luatexja/tool/test_exist_nodelib.tex
-2023/02/11 | 16722 | graphics/pgf/contrib/circuitikz/tex/pgfcircpath.tex
-2023/02/11 | 166557 | macros/luatex/generic/luatexja/doc/lltjp-geometry.pdf
-2023/02/11 | 1657072 | graphics/pgf/contrib/circuitikz/doc/circuitikzmanual.pdf
-2023/02/11 | 1637 | macros/luatex/generic/luatexja/src/addons/luatexja-fontspec.sty
-2023/02/11 | 1616092 | systems/texlive/tlnet/archive/eolang.doc.r65778.tar.xz
-2023/02/11 | 1611 | macros/luatex/generic/luatexja/src/patches/lltjp-footmisc.sty
-2023/02/11 | 15839 | macros/luatex/generic/luatexja/src/addons/luatexja-fontspec-27c.sty
-2023/02/11 | 15688 | systems/texlive/tlnet/archive/eolang.source.r65778.tar.xz
-2023/02/11 | 154928 | macros/luatex/generic/luatexja/src/ltj-ivd_aj1.lua
-2023/02/11 | 15442 | graphics/pgf/contrib/circuitikz/tex/pgfcirclabel.tex
-2023/02/11 | 1536 | macros/luatex/generic/luatexja/COPYING
-2023/02/11 | 14926 | macros/luatex/generic/luatexja/src/ltj-rmlgbm.lua
-2023/02/11 | 14914 | macros/luatex/generic/luatexja/src/patches/lltjp-listings.sty
-2023/02/11 | 147172 | support/pmx/doc/pmx300.tex
-2023/02/11 | 14587 | graphics/pgf/contrib/circuitikz/tex/pgfcircutils.tex
-2023/02/11 | 145458 | support/pmx/doc/file600.eps
-2023/02/11 | 1440 | macros/luatex/latex/piton/piton.ins
-2023/02/11 | 1397 | macros/luatex/generic/luatexja/tool/ivslist.tex
-2023/02/11 | 13895 | macros/luatex/generic/luatexja/src/jfm-ujis.lua
-2023/02/11 | 13737 | graphics/pgf/contrib/circuitikz/tex/circuitikz.sty
-2023/02/11 | 13726 | macros/luatex/generic/luatexja/doc/lltjp-geometry.tex
-2023/02/11 | 13346 | macros/luatex/generic/luatexja/src/ltj-setwidth.lua
-2023/02/11 | 1278 | macros/luatex/generic/luatexja/src/ltjclasses.ins
-2023/02/11 | 12716 | macros/luatex/generic/luatexja/src/patches/lltjcore.sty
-2023/02/11 | 126 | macros/luatex/generic/luatexja/src/ltjltxdoc.ins
-2023/02/11 | 125913 | macros/latex/contrib/codehigh/codehigh.pdf
-2023/02/11 | 1229803 | install/macros/unicodetex/latex/polyglossia.tds.zip
-2023/02/11 | 122970 | macros/latex/contrib/proflycee/tex/ProfLycee.sty
-2023/02/11 | 12256 | macros/luatex/generic/luatexja/src/ltj-base.lua
-2023/02/11 | 1224 | macros/luatex/generic/luatexja/tool/chars2defcharrange.rb
-2023/02/11 | 115961 | graphics/pgf/contrib/circuitikz/tex/pgfcircmultipoles.tex
-2023/02/11 | 1155 | macros/latex/contrib/tidyres/tidyres.sty
-2023/02/11 | 11506 | macros/luatex/generic/luatexja/src/jfm-ujisv.lua
-2023/02/11 | 1149508 | macros/luatex/generic/luatexja/doc/luatexja-ja.pdf
-2023/02/11 | 11386 | language/bengali/bangla/bangla.sty
-2023/02/11 | 11335 | macros/luatex/generic/luatexja/tool/unicodeBlocks.tex
-2023/02/11 | 1130 | macros/luatex/generic/luatexja/tool/function_uax50.lua
-2023/02/11 | 1081680 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.4.6-body.tex
-2023/02/11 | 1073051 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.4.6.tex
-2023/02/11 | 107282 | macros/latex/contrib/codehigh.zip
-2023/02/11 | 10628 | macros/luatex/generic/luatexja/src/addons/luatexja-ruby.sty
-2023/02/11 | 1021798 | graphics/pgf/contrib/circuitikz/tex/circuitikz-1.2.7-body.tex
-2023/02/11 | 1014383 | graphics/pgf/contrib/circuitikz/tex/t-circuitikz-1.2.7.tex
-2023/02/11 | 1013798 | macros/unicodetex/latex/polyglossia/polyglossia.dtx
diff --git a/biblio/ctan-bibdata/ctan.bib b/biblio/ctan-bibdata/ctan.bib
index 1943be4d57..3b2dd57bc3 100644
--- a/biblio/ctan-bibdata/ctan.bib
+++ b/biblio/ctan-bibdata/ctan.bib
@@ -1,7 +1,7 @@
%% bib file of all CTAN packages
%% (C) Herbert Voß
%%
-%% created at 18-02-2023, 02:00:57
+%% created at 19-02-2023, 02:00:15
%%
%% This file is provided under the terms of the LPPL v1.3 or
@@ -11751,8 +11751,8 @@
title = {The \texttt{chemfig} package},
subtitle = {Draw molecules with easy syntax},
author = {Christian Tellechea},
- date = {2022-09-27},
- version = {1.6c},
+ date = {2023-02-18},
+ version = {1.6d},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/generic/chemfig},
url = {https://ctan.org/pkg/chemfig},
@@ -41201,8 +41201,8 @@
title = {The \texttt{luapstricks} package},
subtitle = {A PSTricks backend for LuaLaTeX},
author = {Marcel Krüger},
- date = {2022-09-11},
- version = {0.6},
+ date = {2023-02-18},
+ version = {0.8},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/graphics/pstricks/contrib/luapstricks},
url = {https://ctan.org/pkg/luapstricks},
@@ -47777,8 +47777,8 @@
title = {The \texttt{nicematrix} package},
subtitle = {Improve the typesetting of mathematical matrices with PGF},
author = {François Pantigny},
- date = {2023-02-05},
- version = {6.13f},
+ date = {2023-02-18},
+ version = {6.14},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/nicematrix},
url = {https://ctan.org/pkg/nicematrix},
@@ -52529,10 +52529,10 @@
@manual{ctan-pixelart,
title = {The \texttt{pixelart} package},
- subtitle = {A package to draw pixel-art pictures},
+ subtitle = {Draw pixel-art pictures},
author = {Louis Paternault},
- date = {2022-11-16},
- version = {1.0.0},
+ date = {2023-02-18},
+ version = {1.0.1},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/graphics/pgf/contrib/pixelart},
url = {https://ctan.org/pkg/pixelart},
@@ -57608,7 +57608,7 @@
title = {The \texttt{recorder-fingering} package},
subtitle = {Package to display recorder fingering diagrams},
author = {Alan Munn},
- date = {2023-02-17},
+ date = {2023-02-18},
version = {1.0},
license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/latex/contrib/recorder-fingering},
@@ -62865,11 +62865,11 @@
@manual{ctan-soul,
title = {The \texttt{soul} package},
- subtitle = {Hyphenation for letterspacing, underlining, and more},
- author = {Melchior Franz},
- date = {2020-09-30},
- version = {2.4},
- license = {lppl},
+ subtitle = {soul – Hyphenation for letterspacing, underlining, and more},
+ author = {Heiko Oberdiek},
+ date = {2023-02-18},
+ version = {3.0},
+ license = {lppl1.3},
mirror = {https://mirror.ctan.org/macros/generic/soul},
url = {https://ctan.org/pkg/soul},
}
@@ -62894,23 +62894,6 @@
is a single element.},
}
-@manual{ctan-soulutf8,
- title = {The \texttt{soulutf8} package},
- subtitle = {Permit use of UTF-8 characters in soul},
- author = {Heiko Oberdiek},
- date = {2019-12-21},
- version = {1.2},
- license = {lppl1.3},
- mirror = {https://mirror.ctan.org/macros/latex/contrib/soulutf8},
- url = {https://ctan.org/pkg/soulutf8},
- annotation = {This package extends package and adds
- some support for UTF-8. Namely the input encodings in
- ‘’ from package
- and
- ‘’ from package
- are supported.},
-}
-
@manual{ctan-soup,
title = {The \texttt{soup} package},
subtitle = {Generate alphabet soup puzzles},
@@ -75634,8 +75617,8 @@
title = {The \texttt{xduts} package},
subtitle = {Xidian University \TeX{} Suite},
author = {{Unknown}},
- date = {2023-02-17},
- version = {4.4.5.5},
+ date = {2023-02-18},
+ version = {5.0.0.0},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/xetex/latex/xduts},
url = {https://ctan.org/pkg/xduts},
@@ -77547,8 +77530,8 @@
title = {The \texttt{zref-clever} package},
subtitle = {Clever \LaTeX{} cross-references based on zref},
author = {Gustavo Barros},
- date = {2023-02-13},
- version = {0.3.4},
+ date = {2023-02-18},
+ version = {0.3.5},
license = {lppl1.3c},
mirror = {https://mirror.ctan.org/macros/latex/contrib/zref-clever},
url = {https://ctan.org/pkg/zref-clever},
diff --git a/biblio/ctan-bibdata/ctan.pdf b/biblio/ctan-bibdata/ctan.pdf
index 4e7ac6d1af..45c5022199 100644
--- a/biblio/ctan-bibdata/ctan.pdf
+++ b/biblio/ctan-bibdata/ctan.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pixelart/CHANGELOG.md b/graphics/pgf/contrib/pixelart/CHANGELOG.md
index daf7e7e726..ee5be079dd 100644
--- a/graphics/pgf/contrib/pixelart/CHANGELOG.md
+++ b/graphics/pgf/contrib/pixelart/CHANGELOG.md
@@ -1,3 +1,16 @@
+* pixelart 1.0.1 (2023-02-18)
+
+ * Bugs
+
+ * Minor change to take into account backward-incompatible change in `luakeys` v0.13.0 (thanks Jonathan P. Spratte).
+ * Pixelart (with option `square`) no longer fails when asked to draw an empty pixelart.
+
+ * Documentation
+
+ * Minor changes and improvements.
+
+ -- Louis Paternault <spalax@gresille.org>
+
* pixelart 1.0.0 (2022-11-16)
* Full, backward incompatible, rewrite of `pixelart`, in Lua.
diff --git a/graphics/pgf/contrib/pixelart/README.md b/graphics/pgf/contrib/pixelart/README.md
index 47eb31b3b6..fa717d9015 100644
--- a/graphics/pgf/contrib/pixelart/README.md
+++ b/graphics/pgf/contrib/pixelart/README.md
@@ -1,7 +1,7 @@
pixelart 🎨 A LaTeX package to draw pixel-art pictures
======================================================
-![Example](https://framagit.org/spalax/pixelart/-/raw/v1.0.0/pixelart.png)
+![Example](https://framagit.org/spalax/pixelart/-/raw/v1.0.1/pixelart.png)
- [Usage and installation instruction](http://mirrors.ctan.org/graphics/pgf/contrib/pixelart/pixelart.pdf).
- Example: The heart of the picture above was produced using the following code.
@@ -30,7 +30,7 @@ pixelart 🎨 A LaTeX package to draw pixel-art pictures
License
-------
-*Copyright 2018-2022 Louis Paternault*
+*Copyright 2017-2023 Louis Paternault*
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)
diff --git a/graphics/pgf/contrib/pixelart/pixelart.lua b/graphics/pgf/contrib/pixelart/pixelart.lua
index 97a76d8f76..d5c98e3898 100644
--- a/graphics/pgf/contrib/pixelart/pixelart.lua
+++ b/graphics/pgf/contrib/pixelart/pixelart.lua
@@ -1,5 +1,23 @@
+--[[
+ Copyright 2017-2023 Louis Paternault
+
+ 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 Louis Paternault
+
+ This work consists of the files pixelart.sty, pixelart.lua, pixelart.tex.
+--]]
+
require("lualibs-lpeg")
-local luakeys = require("luakeys")
+local luakeys = require("luakeys")()
pixelart = {
_debug = false,
@@ -16,7 +34,6 @@ local function pixelart_setpixelartdebug(flag)
end
pixelart.setpixelartdebug = pixelart_setpixelartdebug
-pixelart.setpixelartdebug = pixelart_setpixelartdebug
--------------------------------------------------------------------------------
--[[ Print
@@ -269,6 +286,11 @@ end
local function pixelart_body_squares(array, colors, options)
-- Draw the tikz pixels, as a set of squares.
+ if #array == 0 then
+ -- Empty array
+ return
+ end
+
tex_print(string.format(
[[\clip ({0-%s}, {0-%s}) rectangle (%s, %s); ]],
options.margin,
diff --git a/graphics/pgf/contrib/pixelart/pixelart.pdf b/graphics/pgf/contrib/pixelart/pixelart.pdf
index 2a66d842aa..615676f083 100644
--- a/graphics/pgf/contrib/pixelart/pixelart.pdf
+++ b/graphics/pgf/contrib/pixelart/pixelart.pdf
Binary files differ
diff --git a/graphics/pgf/contrib/pixelart/pixelart.sty b/graphics/pgf/contrib/pixelart/pixelart.sty
index 52b90e4afc..4fa15d8101 100644
--- a/graphics/pgf/contrib/pixelart/pixelart.sty
+++ b/graphics/pgf/contrib/pixelart/pixelart.sty
@@ -1,5 +1,21 @@
+%% Copyright 2017-2023 Louis Paternault
+%%
+%% 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 Louis Paternault
+%%
+%% This work consists of the files pixelart.sty, pixelart.lua, pixelart.tex.
+
\NeedsTeXFormat{LaTeX2e}
-\ProvidesPackage{pixelart}
+\ProvidesPackage{pixelart}[2023/02/18 v1.0.1 A package to draw pixel-art pictures]
\RequirePackage{iftex}
\ifluatex
diff --git a/graphics/pgf/contrib/pixelart/pixelart.tex b/graphics/pgf/contrib/pixelart/pixelart.tex
index 1ab064ce56..bfcf1e5863 100644
--- a/graphics/pgf/contrib/pixelart/pixelart.tex
+++ b/graphics/pgf/contrib/pixelart/pixelart.tex
@@ -9,8 +9,8 @@
\setcnltx{
name = pixelart,
title = \pixelartlogo,
- version = v1.0.0,
- date = 2022-11-16,
+ version = v1.0.1,
+ date = 2023-02-18,
info = A \LaTeX{} package to draw pixel-art pictures ,
authors = Louis Paternault ,
email = spalax(at)gresille(dot)org ,
@@ -446,6 +446,8 @@ If you want to credit \pkg*{pixelart} in a fancy way, you can use one of those l
\end{commands}
\end{multicols}
+Note that those logos are affected by \cs{setpixelartdefault}, so, if you have used this command in your document, you might want to call \cs*{setpixelartdefault}\marg{} to reset the default options before drawing any logo.
+
\section{Debugging}
What if drawing your pixel art throws an error?
diff --git a/graphics/pgf/contrib/pixelart/pixelart0.pdf b/graphics/pgf/contrib/pixelart/pixelart0.pdf
index ec118f46fb..abd374878a 100644
--- a/graphics/pgf/contrib/pixelart/pixelart0.pdf
+++ b/graphics/pgf/contrib/pixelart/pixelart0.pdf
Binary files differ
diff --git a/graphics/pstricks/contrib/luapstricks/luapstricks.lua b/graphics/pstricks/contrib/luapstricks/luapstricks.lua
index 5482582d15..ee88e48993 100644
--- a/graphics/pstricks/contrib/luapstricks/luapstricks.lua
+++ b/graphics/pstricks/contrib/luapstricks/luapstricks.lua
@@ -18,8 +18,8 @@
if luatexbase then
luatexbase.provides_module {
name = 'luapstricks',
- version = 'v0.6',
- date = '2022-09-10',
+ version = 'v0.8',
+ date = '2023-02-17',
description = 'PSTricks backend for LuaLaTeX',
}
end
@@ -3016,11 +3016,16 @@ systemdict = {kind = 'dict', value = {
texio.write_nl('term and log', ps_to_string(operand_stack[i]))
end
end,
+ pstack = function()
+ for i=#operand_stack, 1, -1 do
+ texio.write_nl('term and log', ps_to_string(require'inspect'(operand_stack[i])))
+ end
+ end,
['='] = function()
texio.write_nl('term and log', ps_to_string(pop()))
end,
['=='] = function() -- FIXME: Should give a better representation
- texio.write_nl('term and log', ps_to_string(pop()))
+ texio.write_nl('term and log', require'inspect'((pop())))
end,
stringwidth = function()
@@ -3941,12 +3946,14 @@ local register_texbox do
local op = function()
flush_delayed()
local state = graphics_stack[#graphics_stack]
- local w, h, d = node.direct.dimensions(box.box)
+ local copied = node.direct.copy(box.box)
+ local w, h, d = node.direct.dimensions(copied)
register_point(state, 0, -d/65781.76)
register_point(state, w/65781.76, h/65781.76)
vf.push()
- vf.node(box.box)
+ vf.node(copied)
vf.pop()
+ node.direct.free(copied)
end
lua_node_lookup[op] = box
dict[id] = op
@@ -4155,7 +4162,11 @@ lua.get_functions_table()[func] = function()
local tokens = token.scan_argument(true)
if file then
context = tokens
- local f = io.open(kpse.find_file(tokens, 'PostScript header'), 'r')
+ local resolved, msg = kpse.find_file(tokens, 'PostScript header')
+ if not resolved then
+ return tex.error(string.format('luapstricks: Unable to open %q: %s', tokens, msg))
+ end
+ local f = io.open(resolved, 'r')
tokens = f:read'a'
f:close()
end
diff --git a/macros/generic/chemfig/README b/macros/generic/chemfig/README
index 9613f062ef..b3ec8d1b81 100644
--- a/macros/generic/chemfig/README
+++ b/macros/generic/chemfig/README
@@ -2,9 +2,9 @@ ___________________________________
The
Chemfig package
- v1.6c
+ v1.6d
- 2022/09/27
+ 2023/02/18
___________________________________
Maintainer: Christian Tellechea
diff --git a/macros/generic/chemfig/chemfig-en.pdf b/macros/generic/chemfig/chemfig-en.pdf
index 0fef2cb8dc..e4de3cc058 100644
--- a/macros/generic/chemfig/chemfig-en.pdf
+++ b/macros/generic/chemfig/chemfig-en.pdf
Binary files differ
diff --git a/macros/generic/chemfig/chemfig-en.tex b/macros/generic/chemfig/chemfig-en.tex
index b0b0bf3176..a5c68c4b6f 100644
--- a/macros/generic/chemfig/chemfig-en.tex
+++ b/macros/generic/chemfig/chemfig-en.tex
@@ -1,7 +1,6 @@
+% !TeX TS-program = lualatex
\documentclass[10pt]{article}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
-\usepackage[a4paper,margin=2.5cm,head=17pt,headsep=3mm,footskip=10mm]{geometry}
+\usepackage[a4paper,margin=2.5cm,footskip=10mm]{geometry}
\usepackage[bottom]{footmisc}
\usepackage{libertine,amsmath,array,longtable,xspace,fancybox,boites,textcomp,enumitem,chemfig,fancyhdr}
\usetikzlibrary{decorations.pathmorphing}
@@ -2854,32 +2853,30 @@ $\star\quad\star$
\schemestop
\chemnameinit{}/
-\begingroup\catcode`;12
-\exemple*{Explanatory diagram}/\parbox{0.8\linewidth}{%
- \hspace{10em}
- \tikz[remember picture]\node(n0){\chemname{}{Attacks\\nucleophiles}};\par
- \vspace{2ex}\hspace{15em}
- \chemfig{R^2-(-[:-60]@{m3}H)-[:60]@{m0}\charge{45:5pt=$\scriptstyle\color{red}\delta+$}{}(-[:120]R^1)
- =[@{m1}]@{m2}\charge {45=\:,-45=\:,45:7pt=$\scriptstyle\color{red}\delta-$}{O}}
- \hspace{5em}
- \chemname[-15ex]{}{\tikz[remember picture]\node(n1){};Addition reactions}\kern1em
- \chemname{}{\tikz[remember picture]\node(n2){};Basic properties}\par
- \vspace{6ex}\hspace{8em}
- \chemname{}{Acidic properties of hydrogen\tikz[remember picture]\node(n3){};
- \\atom in $\alpha$ position}
- \chemmove[-stealth,line width=0.8pt,green!60!black!70]{
- \draw[shorten >=2pt](n0)..controls+(270:4em)and+(180:2em)..(a1);
- \draw[shorten >=8pt](n1)..controls+(180:2em)and+(60:2em)..(a2);
- \draw[shorten >=5pt](n2)..controls+(180:2em)and+(270:2em)..([xshift=3pt]a3.315);
- \draw[shorten >=2pt](n3)..controls+(0:2em)and+(270:2em)..(a0);
- }%
-}
-\chemnameinit{}/
-\endgroup
-
\exemple*{Taxotere}/\chemfig{-[::-30](-[5])(-[7])-[::+60]-[::-60]O-[::+60](=[::-45]O)-[::+90]HN>:[::-60](-[::+60]**6(------))
-[::-30](<:[2]OH)-[::-60](=[6]O)-[::+60]O>:[::-60]*7(---?(<[::-120]OH)-(<|[1]CH_3)(<:[::-90]CH_3)
-(-[1](<[::+80]HO)-[0](=[::+60]O)-[7](<|[::+130]CH_3)(-[::+75](<|[2]OH)-[::-60]-[::-60](<[::+30]O-[::-90])
-[::-60](<[::+90])(<:[::+30]O-[7](-[6]CH_3)=[0]O)-[::-60])-[6]-[5,1.3]?(<:[7]O-[5](=[::-60]O)
-[6]**6(------)))=(-[2]CH_3)-)}/
+
+% https://tex.stackexchange.com/questions/673490/diverging-arrow-in-chemfig/673572#673572
+\exemple*{Diverging arrows}/\schemestart
+ \chemfig{(-[:210]R_2)(-[:330]R_1)=[2]O}
+ \arrow(a--)[,1.5,,,draw=none]
+ \subscheme{
+ \charge{30:4pt=$\mathrm{S}_1$}{\chemleft{[}\chemfig{(-[:210]R_2)(-[:330]R_1)=[2]O}\chemright{]}}
+ \arrow(b--c){->[*{0}ISC]}[-90,1.5]
+ \charge{30:4pt=$\mathrm{T}_1$}{\chemleft[\chemfig{(-[:210]R_2)(-[:330]R_1)=[2]O}\chemright{]}}
+ }
+ \arrow(--d)[,1.5,,,draw=none]
+ \chemfig{(-[:210]R_2)(-[:330,0.1,,,draw=none]\charge{330:-1pt=\.\,}{})=[2]O}
+ \+
+ \chemfig{\charge{90:1pt=\.\,}{R}_1}
+ \schemestop
+\chemmove{
+ \draw[thick,shorten >=10pt] (a.east) -- ++(1,0) |- (b.west);
+ \draw[thick,shorten >=10pt] (a.east) -- ++(1,0) |- (c.west);
+ \draw[-,thick,shorten >=15pt,shorten <=8pt] (b.east) -- ++(1.3,0) |- (d.west);
+ \draw[thick,shorten >=10pt,shorten <=8pt] (c.east) -- ++(1.3,0) |- (d.west);
+}/
\end{document} \ No newline at end of file
diff --git a/macros/generic/chemfig/chemfig-fr.pdf b/macros/generic/chemfig/chemfig-fr.pdf
index 06ca3b912d..0de1a1679d 100644
--- a/macros/generic/chemfig/chemfig-fr.pdf
+++ b/macros/generic/chemfig/chemfig-fr.pdf
Binary files differ
diff --git a/macros/generic/chemfig/chemfig-fr.tex b/macros/generic/chemfig/chemfig-fr.tex
index 918d79ab25..18001f3619 100644
--- a/macros/generic/chemfig/chemfig-fr.tex
+++ b/macros/generic/chemfig/chemfig-fr.tex
@@ -1,6 +1,5 @@
+% !TeX TS-program = lualatex
\documentclass[10pt,french]{article}
-\usepackage[utf8]{inputenc}
-\usepackage[T1]{fontenc}
\usepackage[a4paper,margin=2.5cm,footskip=10mm]{geometry}
\usepackage[bottom]{footmisc}
\usepackage{libertine,amsmath,array,longtable,xspace,fancybox,boites,textcomp,enumitem,chemfig,fancyhdr,multicol}
@@ -2854,32 +2853,30 @@ $\star\quad\star$
\schemestop
\chemnameinit{}/
-\begingroup\catcode`;12
-\exemple*{Schéma explicatif}/\parbox{0.8\linewidth}{%
- \hspace{10em}
- \tikz[remember picture]\node(n0){\chemname{}{Attaques\\nucléophiles}};\par
- \vspace{2ex}\hspace{15em}
- \chemfig{R^2-(-[:-60]@{m3}H)-[:60]@{m0}\charge{45:5pt=$\scriptstyle\color{red}\delta+$}{}(-[:120]R^1)
- =[@{m1}]@{m2}\charge {45=\:,-45=\:,45:7pt=$\scriptstyle\color{red}\delta-$}{O}}
- \hspace{5em}
- \chemname[-15ex]{}{\tikz[remember picture]\node(n1){};Réactions d'addition}\kern1em
- \chemname{}{\tikz[remember picture]\node(n2){};Propriétés basiques}\par
- \vspace{6ex}\hspace{8em}
- \chemname{}{Propriétés acides des atomes\tikz[remember picture]\node(n3){};
- \\d'hydrogène en position $\alpha$}
- \chemmove[-stealth,line width=0.8pt,green!60!black!70]{
- \draw[shorten >=2pt](n0)..controls+(270:4em)and+(180:2em)..(m0);
- \draw[shorten >=8pt](n1)..controls+(180:2em)and+(60:2em)..(m1);
- \draw[shorten >=5pt](n2)..controls+(180:2em)and+(270:2em)..([xshift=3pt]m2.315);
- \draw[shorten >=2pt](n3)..controls+(0:2em)and+(270:2em)..(m3);
- }%
-}
-\chemnameinit{}/
-\endgroup
-
\exemple*{Taxotère}/\chemfig{-[::-30](-[5])(-[7])-[::+60]-[::-60]O-[::+60](=[::-45]O)-[::+90]HN>:[::-60](-[::+60]**6(------))
-[::-30](<:[2]OH)-[::-60](=[6]O)-[::+60]O>:[::-60]*7(---?(<[::-120]OH)-(<|[1]CH_3)(<:[::-90]CH_3)
-(-[1](<[::+80]HO)-[0](=[::+60]O)-[7](<|[::+130]CH_3)(-[::+75](<|[2]OH)-[::-60]-[::-60](<[::+30]O-[::-90])
-[::-60](<[::+90])(<:[::+30]O-[7](-[6]CH_3)=[0]O)-[::-60])-[6]-[5,1.3]?(<:[7]O-[5](=[::-60]O)
-[6]**6(------)))=(-[2]CH_3)-)}/
+
+% https://tex.stackexchange.com/questions/673490/diverging-arrow-in-chemfig/673572#673572
+\exemple*{Flèches divergentes}/\schemestart
+ \chemfig{(-[:210]R_2)(-[:330]R_1)=[2]O}
+ \arrow(a--)[,1.5,,,draw=none]
+ \subscheme{
+ \charge{30:4pt=$\mathrm{S}_1$}{\chemleft{[}\chemfig{(-[:210]R_2)(-[:330]R_1)=[2]O}\chemright{]}}
+ \arrow(b--c){->[*{0}ISC]}[-90,1.5]
+ \charge{30:4pt=$\mathrm{T}_1$}{\chemleft[\chemfig{(-[:210]R_2)(-[:330]R_1)=[2]O}\chemright{]}}
+ }
+ \arrow(--d)[,1.5,,,draw=none]
+ \chemfig{(-[:210]R_2)(-[:330,0.1,,,draw=none]\charge{330:-1pt=\.\,}{})=[2]O}
+ \+
+ \chemfig{\charge{90:1pt=\.\,}{R}_1}
+\schemestop
+\chemmove{
+ \draw[thick,shorten >=10pt] (a.east) -- ++(1,0) |- (b.west);
+ \draw[thick,shorten >=10pt] (a.east) -- ++(1,0) |- (c.west);
+ \draw[-,thick,shorten >=15pt,shorten <=8pt] (b.east) -- ++(1.3,0) |- (d.west);
+ \draw[thick,shorten >=10pt,shorten <=8pt] (c.east) -- ++(1.3,0) |- (d.west);
+}/
\end{document} \ No newline at end of file
diff --git a/macros/generic/chemfig/chemfig.tex b/macros/generic/chemfig/chemfig.tex
index 5ebc702d36..8dfc68592a 100644
--- a/macros/generic/chemfig/chemfig.tex
+++ b/macros/generic/chemfig/chemfig.tex
@@ -4,9 +4,9 @@
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
% %
\def\CFname {chemfig} %
-\def\CFver {1.6c} %
+\def\CFver {1.6d} %
% %
-\def\CFdate {2022/09/27} %
+\def\CFdate {2023/02/18} %
% %
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%
@@ -15,7 +15,7 @@
% Status : Maintained |
% Email : unbonpetit@netc.fr |
% Package URL: https://www.ctan.org/pkg/chemfig |
-% Copyright : Christian Tellechea 2010-2022 |
+% Copyright : Christian Tellechea 2010-2023 |
% Licence : Released under the LaTeX Project Public License v1.3c |
% or later, see http://www.latex-project.org/lppl.txt |
% Files : 1) chemfig.tex |
@@ -45,11 +45,26 @@
\def\X#1{\catcode\number`#1=\number\catcode`#1\relax}
\xdef\CFrestorecatcode{\X\[\X\]\X\:\X\(\X\)\X\,\X\-\X\=\X\~\X\!\X\?\X\<\X\>\X\;\X\*\X\|\X\@\X\ \X\_}%
\endgroup
-\catcode`\[12 \catcode`\]12 \catcode`\:12 \catcode`\(12
-\catcode`\)12 \catcode`\,12 \catcode`\-12 \catcode`\=12
-\catcode`\~12 \catcode`\!12 \catcode`\?12 \catcode`\<12
-\catcode`\>12 \catcode`\;12 \catcode`\*12 \catcode`\|12
-\catcode`\@12 \catcode`\#6 \catcode`\ 10 \catcode`\_11
+\catcode`\[12
+\catcode`\]12
+\catcode`\:12
+\catcode`\(12
+\catcode`\)12
+\catcode`\,12
+\catcode`\-12
+\catcode`\=12
+\catcode`\~12
+\catcode`\!12
+\catcode`\?12
+\catcode`\<12
+\catcode`\>12
+\catcode`\;12
+\catcode`\*12
+\catcode`\|12
+\catcode`\@12
+\catcode`\#6
+\catcode`\ 10
+\catcode`\_11
%-------------------- Vérification des prérequis ---------------------
\def\CF_error#1{\errmessage{Package \CFname\space Error: #1.}}
@@ -78,23 +93,24 @@
\usetikzlibrary{arrows.meta}
%--------------------------- Allocations -----------------------------
-\newcount\CF_cntatomgroup
-\newcount\CF_cntgroup
-\newcount\CF_cntatom
-\newcount\CF_cntcycle
-\newcount\CF_cntcyclebonds
-\newcount\CF_cntcompound
-
-\newif\ifCF_incycle
-\newif\ifCF_cyclearc
-\newif\ifCF_definesubmol
-\newif\ifCF_adjustnamedp
-\newif\ifCF_macrofixedbondlength
+\newcount\CF_cnt_atomgroup
+\newcount\CF_cnt_group
+\newcount\CF_cnt_atom
+\newcount\CF_cnt_cycle
+\newcount\CF_cnt_cyclebonds
+\newcount\CF_cnt_compound
+
+\newif\ifCF_in_cycle
+\newif\ifCF_cycle_arc
+\newif\ifCF_define_submol
+\newif\ifCF_adjust_name_dp
+\newif\ifCF_macro_fixed_bond_length
\newif\ifCF_compound_is_chemfig
\newdimen\CF_dim
\newdimen\CF_arrowsize
-\newdimen\CF_zero \CF_zero=0pt
+\newdimen\CF_zero
+\CF_zero=0pt
\newbox\CF_box
\newbox\CF_boxstuff
@@ -116,7 +132,8 @@
\def\CF_sanitizelastitem#1,\empty#2\_nil{#1}
\def\CF_gobtikzinstruction#1;{}
\def\CF_makeother#1{\catcode`#1=12\relax}
-\def\CF_lettoken#1#2{\let#1= #2}\CF_lettoken\CF_sptoken{ }
+\def\CF_lettoken#1#2{\let#1= #2}
+\CF_lettoken\CF_sptoken{ }
\def\CF_ifx#1#2{\ifx#1#2\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi}
\def\CF_ifempty#1{\ifx\empty#1\empty\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi}
\def\CF_ifnum#1{\ifnum#1\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi}
@@ -166,9 +183,11 @@
}
\def\CF_ifnextchara{%
\CF_ifx\CF_temptok\CF_sptoken
- {\CF_ifnextcharb
+ {%
+ \CF_ifnextcharb
}
- {\CF_ifx\CF_temptok\CF_ifnextchartok
+ {%
+ \CF_ifx\CF_temptok\CF_ifnextchartok
\CF_ifnextcharcodetrue
\CF_ifnextcharcodefalse
}%
@@ -179,7 +198,7 @@
\def\CF_ifinteger#1{%
\begingroup
\afterassignment\CF_afterinteger
- \CF_cntcyclebonds0#1\relax
+ \CF_cnt_cyclebonds0#1\relax
}
\def\CF_afterinteger#1\relax{%
\endgroup
@@ -196,12 +215,18 @@
}
\def\CF_iffirsttokina#1{%
\CF_ifempty{#1}
- {\CF_execsecond
+ {%
+ \CF_execsecond
}
- {\futurelet\CF_toksb\CF_gobtonil#1\relax\_nil
+ {%
+ \futurelet\CF_toksb\CF_gobtonil#1\relax\_nil
\CF_ifx\CF_toksa\CF_toksb
- {\CF_execfirst}
- {\CF_expsecond\CF_iffirsttokina{\CF_gobarg#1}}%
+ {%
+ \CF_execfirst
+ }
+ {%
+ \CF_expsecond\CF_iffirsttokina{\CF_gobarg#1}%
+ }%
}%
}
\def\CF_ifinstr#1#2{%
@@ -218,9 +243,11 @@
%--------------------------- Substitution ----------------------------
\def\CF_ifstartwith#1#2{% #1=<texte> #2=<motif>
\CF_ifempty{#1}%
- {\CF_execsecond
+ {%
+ \CF_execsecond
}
- {\def\CF_startwithcode{#1}%
+ {%
+ \def\CF_startwithcode{#1}%
\def\CF_startwithpattern{#2}%
\CF_ifstartwitha
}%
@@ -229,25 +256,35 @@
\CF_grabfirstarg\CF_startwithcode\CF_firstargcode
\CF_grabfirstarg\CF_startwithpattern\CF_firstargpattern
\CF_ifx\CF_firstargcode\CF_firstargpattern
- {\CF_expsecond\CF_ifempty\CF_startwithpattern
- {\CF_execfirst
+ {%
+ \CF_expsecond\CF_ifempty\CF_startwithpattern
+ {%
+ \CF_execfirst
}
- {\CF_expsecond\CF_ifempty\CF_startwithcode
+ {%
+ \CF_expsecond\CF_ifempty\CF_startwithcode
\CF_execsecond
\CF_ifstartwitha
}%
}
- {\CF_execsecond
+ {%
+ \CF_execsecond
}%
}
\def\CF_grabfirstarg#1#2{%
\CF_ifx#1\empty
- {\let#2\empty
+ {%
+ \let#2\empty
}
- {\def\CF_grabmacro{#2}%
+ {%
+ \def\CF_grabmacro{#2}%
\CF_expsecond\CF_ifbracefirst#1%
- {\expandafter\CF_grabbracearg#1\_nil#1}
- {\CF_expafter{\futurelet\CF_nexttok\CF_grabfirstarga}#1\_nil#1}%
+ {%
+ \expandafter\CF_grabbracearg#1\_nil#1%
+ }
+ {%
+ \CF_expafter{\futurelet\CF_nexttok\CF_grabfirstarga}#1\_nil#1%
+ }%
}%
}
\def\CF_grabfirstarga{%
@@ -273,39 +310,53 @@
\def\CF_atendsubstitute{\edef#2{\the\CF_substtoks}}% macro exécutée à la fin
\let\CF_substnogroups\CF_substnogrouponly
\CF_ifnum{#1>0 }
- {\let\CF_testifx\empty
+ {%
+ \let\CF_testifx\empty
\foreach\CF_x in {1,...,#1}
- {\xdef\CF_testifx{\unexpanded\expandafter{\CF_testifx}\unexpanded\expandafter{\expandafter\ifx\CF_x\CF_nexttok1\fi}}}%
+ {%
+ \xdef\CF_testifx{\unexpanded\expandafter{\CF_testifx}\unexpanded\expandafter{\expandafter\ifx\CF_x\CF_nexttok1\fi}}%
+ }%
\let\CF_testif\empty
\foreach\CF_x in {1,...,#1}
- {\xdef\CF_testif{\unexpanded\expandafter{\CF_testif}\unexpanded\expandafter{\expandafter\if\CF_x\CF_nexttok1\fi}}}%
+ {%
+ \xdef\CF_testif{\unexpanded\expandafter{\CF_testif}\unexpanded\expandafter{\expandafter\if\CF_x\CF_nexttok1\fi}}%
+ }%
\CF_expsecond\CF_substi#2%
}
- {\CF_substall#2%
+ {%
+ \CF_substall#2%
}%
}
\def\CF_substnogrouponly{%
\CF_exptwomacroargs\CF_ifstartwith\CF_substcode\CF_substsubst
- {\CF_grabfirstarg\CF_substcode\CF_temp
+ {%
+ \CF_grabfirstarg\CF_substcode\CF_temp
\CF_expafter{\futurelet\CF_nexttok\CF_gobtonil}\CF_substcode\relax\_nil
\CF_ifnum{0\CF_testifx=1 }% si le prochain token est \let-égal à 1...#1
- {\edef\CF_nexttok{\CF_threeea\CF_firsttonil\expandafter\string\CF_substcode\_nil}% le détokéniser
+ {%
+ \edef\CF_nexttok{\CF_threeea\CF_firsttonil\expandafter\string\CF_substcode\_nil}% le détokéniser
\CF_ifnum{0\CF_testif=1 }
- {\CF_eaddtotoks\CF_substtoks\CF_temp
+ {%
+ \CF_eaddtotoks\CF_substtoks\CF_temp
\CF_grabfirstarg\CF_substcode\CF_temp
\CF_eaddtotoks\CF_substtoks\CF_temp
}
- {\CF_eaddtotoks\CF_substtoks\CF_substpattern
+ {%
+ \CF_eaddtotoks\CF_substtoks\CF_substpattern
}%
}
- {\CF_eaddtotoks\CF_substtoks\CF_substpattern
+ {%
+ \CF_eaddtotoks\CF_substtoks\CF_substpattern
}%
\CF_substgroups
}
- {\CF_expsecond\CF_ifempty\CF_substcode
- {\CF_atendsubstitute
+ {%
+ \CF_expsecond\CF_ifempty\CF_substcode
+ {%
+ \CF_atendsubstitute
}
- {\CF_grabfirstarg\CF_substcode\CF_substauxarg
+ {%
+ \CF_grabfirstarg\CF_substcode\CF_substauxarg
\CF_eaddtotoks\CF_substtoks\CF_substauxarg
\CF_substgroups
}%
@@ -318,14 +369,18 @@
}
\def\CF_substnogroupall{%
\CF_exptwomacroargs\CF_ifstartwith\CF_substcode\CF_substsubst
- {\CF_eaddtotoks\CF_substtoks\CF_substpattern
+ {%
+ \CF_eaddtotoks\CF_substtoks\CF_substpattern
\CF_grabfirstarg\CF_substcode\CF_temp
\CF_substgroups
}
- {\CF_expsecond\CF_ifempty\CF_substcode
- {\CF_atendsubstitute
+ {%
+ \CF_expsecond\CF_ifempty\CF_substcode
+ {%
+ \CF_atendsubstitute
}
- {\CF_grabfirstarg\CF_substcode\CF_substauxarg
+ {%
+ \CF_grabfirstarg\CF_substcode\CF_substauxarg
\CF_eaddtotoks\CF_substtoks\CF_substauxarg
\CF_substgroups
}%
@@ -339,7 +394,8 @@
\def\CF_substgroups{%
\CF_expsecond\CF_ifbracefirst\CF_substcode
- {\CF_grabfirstarg\CF_substcode\CF_substauxarg
+ {%
+ \CF_grabfirstarg\CF_substcode\CF_substauxarg
\begingroup
\def\CF_atendsubstitute{%
\expandafter\endgroup\expandafter\CF_addtotoks\expandafter\CF_substtoks\expandafter{\expandafter{\the\CF_substtoks}}%
@@ -349,7 +405,8 @@
\expandafter\def\expandafter\CF_substcode\CF_substauxarg
\CF_substgroups
}%
- {\CF_substnogroups
+ {%
+ \CF_substnogroups
}%
}
@@ -429,37 +486,55 @@
%%% D E S S I N M O L É C U L E S %%%
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\CF_sanitizecatcode{%
- \CF_makeother\[\CF_makeother\]\CF_makeother\:\CF_makeother\(\CF_makeother\)%
- \CF_makeother\,\CF_makeother\-\CF_makeother\=\CF_makeother\~\CF_makeother\!%
- \CF_makeother\?\CF_makeother\<\CF_makeother\>\CF_makeother\;\CF_makeother\*%
- \CF_makeother\|\CF_makeother\#\CF_makeother\@%
+ \CF_makeother\[%
+ \CF_makeother\]%
+ \CF_makeother\:%
+ \CF_makeother\(%
+ \CF_makeother\)%
+ \CF_makeother\,%
+ \CF_makeother\-%
+ \CF_makeother\=%
+ \CF_makeother\~%
+ \CF_makeother\!%
+ \CF_makeother\?%
+ \CF_makeother\<%
+ \CF_makeother\>%
+ \CF_makeother\;%
+ \CF_makeother\*%
+ \CF_makeother\|%
+ \CF_makeother\#%
+ \CF_makeother\@%
}
\def\printatom#1{\ifmmode\rm#1\else$\rm#1$\fi}
-\def\CF_nodecontent{\CF_expsecond\printatom{\csname atom_\number\CF_cntatom\endcsname\CF_nodestrut}}
+\def\CF_nodecontent{\CF_expsecond\printatom{\csname atom_\number\CF_cnt_atom\endcsname\CF_nodestrut}}
\def\chemskipalign{%
\CF_doifempty\CF_bondoutcontentsaved% sauf si un \chemskipalign a été fait à l'atome précédent
- {\global\let\CF_bondoutcontentsaved\CF_bondoutcontent}% sauvegarder l'atome d'où vient la liaison
+ {%
+ \global\let\CF_bondoutcontentsaved\CF_bondoutcontent% sauvegarder l'atome d'où vient la liaison
+ }%
\let\CF_nodestrut\empty
}
-\def\definesubmol{\CF_definesubmoltrue\def_submol}
-\def\redefinesubmol{\CF_definesubmolfalse\def_submol}
+\def\definesubmol{\CF_define_submoltrue\CF_defsubmol}
+\def\redefinesubmol{\CF_define_submolfalse\CF_defsubmol}
-\def\def_submol#1{%
- \CF_cntatomgroup=0 % nombre d'arguments supposé
+\def\CF_defsubmol#1{%
+ \CF_cnt_atomgroup=0 % nombre d'arguments supposé
\def\CF_temp{#1}% nom
\futurelet\CF_toksa\CF_submoltestnxttok
}
\def\CF_submoltestnxttok{%
\if[\noexpand\CF_toksa\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi
- {\begingroup\CF_sanitizecatcode\CF_expsecond\CF_submolgrabopt{\CF_temp}%
+ {%
+ \begingroup\CF_sanitizecatcode\CF_expsecond\CF_submolgrabopt{\CF_temp}%
}
- {\afterassignment\CF_submoltestnxttoka% pas d'argument entre crochet
- \CF_cntatomgroup=0% cherche le nombre d'arguments éventuels
+ {%
+ \afterassignment\CF_submoltestnxttoka% pas d'argument entre crochet
+ \CF_cnt_atomgroup=0% cherche le nombre d'arguments éventuels
}%
}
@@ -467,60 +542,79 @@
\def\CF_submoltestnxttokb{%
\if[\noexpand\CF_toksa\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi
- {\begingroup\CF_sanitizecatcode\CF_expsecond\CF_submolgrabopt{\CF_temp}}
- {\CF_expsecond{\def_submola}\CF_temp{}}%
+ {%
+ \begingroup\CF_sanitizecatcode\CF_expsecond\CF_submolgrabopt{\CF_temp}%
+ }
+ {%
+ \CF_expsecond{\CF_defsubmola}\CF_temp{}%
+ }%
}
-\def\CF_submolgrabopt#1[#2]#{\endgroup\def_submola{#1}{#2}}
+\def\CF_submolgrabopt#1[#2]#{\endgroup\CF_defsubmola{#1}{#2}}
-\def\def_submola#1{% #1 nom
- \CF_ifnum{0\CF_ifnum{\CF_cntatomgroup<0 }1{\CF_ifnum{\CF_cntatomgroup>9 }10}>0 }
- {\CF_error{Invalid number of arguments in submol \detokenize\expandafter{\string#1}. Defining it with 0 argument}%
- \CF_cntatomgroup=0
+\def\CF_defsubmola#1{% #1 nom
+ \CF_ifnum{0\CF_ifnum{\CF_cnt_atomgroup<0 }1{\CF_ifnum{\CF_cnt_atomgroup>9 }10}>0 }
+ {%
+ \CF_error{Invalid number of arguments in submol \detokenize\expandafter{\string#1}. Defining it with 0 argument}%
+ \CF_cnt_atomgroup=0
}
{}%
\ifcat\relax\expandafter\noexpand\CF_firsttonil#1\_nil\expandafter\CF_execfirst\else\expandafter\CF_execsecond\fi% si #1 est une séquence de contrôle
- {\expandafter\ifdefined\CF_firsttonil#1\_nil
- \ifCF_definesubmol
+ {%
+ \expandafter\ifdefined\CF_firsttonil#1\_nil
+ \ifCF_define_submol
\CF_warning{the submol \expandafter\string\CF_firsttonil#1\_nil\space is already defined, the previous definition is lost}%
\fi
\fi
\begingroup
\CF_sanitizecatcode
- \def_submolb{#1}%
+ \CF_defsubmolb{#1}%
}
- {\ifcsname CF__#1\endcsname
- \ifCF_definesubmol
+ {%
+ \ifcsname CF__#1\endcsname
+ \ifCF_define_submol
\CF_warning{the submol "#1" is already defined, the previous definition is lost}%
\fi
\fi
\begingroup
\CF_sanitizecatcode
- \expandafter\def_submolb\csname CF__#1\endcsname
+ \expandafter\CF_defsubmolb\csname CF__#1\endcsname
}%
}
-\def\def_submolb#1#2#3{% #1 nom sous forme de macro, #2 = code si liaison arrive de droite , #3 = code si liaison arrive de gauche, \CF_cntatomgroup = nombre d'arguments
- \def\CF_tempa{#2}\CF_doifnotempty{#2}{\CF_expsecond{\CF_expsecond\CF_substonly{\number\CF_cntatomgroup}\CF_tempa}{\CFhash}{\CFhash}}%
- \def\CF_tempb{#3}\CF_expsecond{\CF_expsecond\CF_substonly{\number\CF_cntatomgroup}\CF_tempb}{\CFhash}{\CFhash}%
- \CF_expsecond{\CF_expsecond{\def_submolc{#1}}\CF_tempa}\CF_tempb
+\def\CF_defsubmolb#1#2#3{% #1 nom sous forme de macro, #2 = code si liaison arrive de droite , #3 = code si liaison arrive de gauche, \CF_cnt_atomgroup = nombre d'arguments
+ \def\CF_tempa{#2}%
+ \CF_doifnotempty{#2}
+ {%
+ \CF_expsecond{\CF_expsecond\CF_substonly{\number\CF_cnt_atomgroup}\CF_tempa}{\CFhash}{\CFhash}%
+ }%
+ \def\CF_tempb{#3}%
+ \CF_expsecond{\CF_expsecond\CF_substonly{\number\CF_cnt_atomgroup}\CF_tempb}{\CFhash}{\CFhash}%
+ \CF_expsecond{\CF_expsecond{\CF_defsubmolc{#1}}\CF_tempa}\CF_tempb
}
-\def\def_submolc#1#2#3{% #1 nom sous forme de macro, #2 = code si liaison arrive de droite , #3 = code si liaison arrive de gauche, \CF_cntatomgroup = nombre d'arguments
+\def\CF_defsubmolc#1#2#3{% #1 nom sous forme de macro, #2 = code si liaison arrive de droite , #3 = code si liaison arrive de gauche, \CF_cnt_atomgroup = nombre d'arguments
\endgroup
\begingroup
\global\toks0{\gdef\CFthesubmol}%
- \CF_ifnum{\CF_cntatomgroup>0 }
- {\foreach\CF_x in {1,...,\CF_cntatomgroup}{%
+ \CF_ifnum{\CF_cnt_atomgroup>0 }
+ {%
+ \foreach\CF_x in {1,...,\CF_cnt_atomgroup}%
+ {%
\global\toks0\expandafter{\expanded{\the\toks0\CFhash\CF_x}}%
}%
}
{}%
- \CF_sanitizecatcode \catcode`\#6 \endlinechar-1 \everyeof{\noexpand}%
+ \CF_sanitizecatcode
+ \catcode`\#6
+ \endlinechar-1
+ \everyeof{\noexpand}%
\CF_ifempty{#2}%
- {\scantokens\expandafter{\the\toks0{\empty#3}}%
+ {%
+ \scantokens\expandafter{\the\toks0{\empty#3}}%
}%
- {\scantokens\expandafter{%
+ {%
+ \scantokens\expandafter{%
\the\toks0{%
\expanded{% bugfix 1.52
\csname CF_exec%
@@ -543,37 +637,51 @@
\let#1\CFthesubmol
}
-\def\CF_seeknode#1#2#3{% cherche un noeud au début de #1 l'assigne dans la sc #2 et met le reste dans #3
+\def\CF_searchnode#1#2#3{% cherche un noeud au début de #1 l'assigne dans la sc #2 et met le reste dans #3
\let#2\empty
\def#3{#1}%
\CF_iffirsttokmatch{#1}{ }%
- {\CF_expsecond\CF_seeknodea{\romannumeral-`\.\noexpand#1}#2#3}% ignore les espaces au début du groupe d'atome
- {\CF_seeknodea{#1}#2#3}%
+ {%
+ \CF_expsecond\CF_searchnodea{\romannumeral-`\.\noexpand#1}#2#3% ignore les espaces au début du groupe d'atome
+ }%
+ {%
+ \CF_searchnodea{#1}#2#3%
+ }%
}
-\def\CF_seeknodea#1#2#3{%
+\def\CF_searchnodea#1#2#3{%
\CF_ifempty{#1}%
- {\let#3\empty
+ {%
+ \let#3\empty
}
- {\futurelet\CF_toksa\CF_gobtonil#1\relax\_nil
+ {%
+ \futurelet\CF_toksa\CF_gobtonil#1\relax\_nil
\CF_ifx\CF_toksa\CF_sptoken
- {\CF_addtomacro#2{ }%
- \CF_expsecond\CF_seeknodea{\CF_afterspace#1\_nil}#2#3%
+ {%
+ \CF_addtomacro#2{ }%
+ \CF_expsecond\CF_searchnodea{\CF_afterspace#1\_nil}#2#3%
}%
- {\CF_ifx\CF_toksa\bgroup
- {\CF_eaddtomacro#2{\expandafter{\CF_firsttonil#1\_nil}}%
- \CF_expsecond\CF_seeknodea{\CF_gobarg#1}#2#3%
+ {%
+ \CF_ifx\CF_toksa\bgroup
+ {%
+ \CF_eaddtomacro#2{\expandafter{\CF_firsttonil#1\_nil}}%
+ \CF_expsecond\CF_searchnodea{\CF_gobarg#1}#2#3%
}%
- {\CF_ifx!\CF_toksa% Bugfix v1.5
- {\def\CF_seeksubmloltemp{#1}%
- \CF_seeksubmola
- \CF_expsecond\CF_seeknodea\CF_seeksubmloltemp#2#3%
+ {%
+ \CF_ifx!\CF_toksa% Bugfix v1.5
+ {%
+ \def\CF_seeksubmloltemp{#1}%
+ \CF_searchsubmola
+ \CF_expsecond\CF_searchnodea\CF_seeksubmloltemp#2#3%
}
- {\CF_iffirsttokina{-=(*<>~}%
- {\def#3{#1}%
+ {%
+ \CF_iffirsttokina{-=(*<>~}%
+ {%
+ \def#3{#1}%
}%
- {\CF_eaddtomacro#2{\CF_firsttonil#1\_nil}%
- \CF_expsecond\CF_seeknodea{\CF_gobarg#1}#2#3%
+ {%
+ \CF_eaddtomacro#2{\CF_firsttonil#1\_nil}%
+ \CF_expsecond\CF_searchnodea{\CF_gobarg#1}#2#3%
}%
}
}%
@@ -591,14 +699,19 @@
\ifx~\CF_toksa3\else
\ifx>\CF_toksa4\else
\ifx<\CF_toksa5\else0% si 0 --> il y a une erreur non due à l'utilisateur
- \fi\fi\fi\fi\fi}%
+ \fi\fi\fi\fi\fi
+ }%
\ifnum#2>3 % si c'est une liaison de Cram
\CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_gobarg#1\_nil}% chope le caractère suivant
\CF_ifx:\CF_toksa
- {\edef#2{\number\numexpr#2+2}% si c 'est un ":", signe du pointillé, ajoute 2
+ {%
+ \edef#2{\number\numexpr#2+2}% si c 'est un ":", signe du pointillé, ajoute 2
}%
- {\CF_ifx|\CF_toksa% si c 'est un "|", signe du triangle évidé, ajouter 4
- {\edef#2{\number\numexpr#2+4}}
+ {%
+ \CF_ifx|\CF_toksa% si c 'est un "|", signe du triangle évidé, ajouter 4
+ {%
+ \edef#2{\number\numexpr#2+4}%
+ }
{}%
}%
\fi
@@ -610,9 +723,14 @@
\def\CF_grabbondoffset#1(#2)#3\_nil{%
\CF_doifnotempty{#2}%
- {\CF_ifinstr{#2},%
- {\CF_grabbondoffseta#2\_nil}%
- {\def\CF_startoffset{#2}}%
+ {%
+ \CF_ifinstr{#2},%
+ {%
+ \CF_grabbondoffseta#2\_nil
+ }%
+ {%
+ \def\CF_startoffset{#2}%
+ }%
}%
\def\CF_remainafterbond{#3}%
}
@@ -624,10 +742,12 @@
\ifnum#2=2 % si c'est une double liaison, regarde s'il y a un + ou - derrière
\CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_gobarg#1\_nil}%
\CF_ifx^\CF_toksa
- {\def\CF_doublebondtype{1}%
+ {%
+ \def\CF_doublebondtype{1}%
\CF_expsecond{\def\CF_remainafterbond}{\CF_gobtwoargs#1}% mange le "^"
}
- {\expandafter\ifx\CF_underscore\CF_toksa
+ {%
+ \expandafter\ifx\CF_underscore\CF_toksa
\def\CF_doublebondtype{2}%
\CF_expsecond{\def\CF_remainafterbond}{\CF_gobtwoargs#1}% mange le "_"
\fi
@@ -638,25 +758,32 @@
\fi
\fi
\CF_expsecond\CF_iffirsttokmatch\CF_remainafterbond\CFhash
- {\CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_remainafterbond.}(%si parenthèse juste après
- {\expandafter\CF_grabbondoffset\CF_remainafterbond\_nil}
+ {%
+ \CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_remainafterbond.}(%si parenthèse juste après
+ {%
+ \expandafter\CF_grabbondoffset\CF_remainafterbond\_nil
+ }
{}%
}%
{}%
\CF_expsecond\CF_iffirsttokmatch\CF_remainafterbond @%
- {\expandafter\CF_grabmovearg\CF_remainafterbond\_nil}%
+ {%
+ \expandafter\CF_grabmovearg\CF_remainafterbond\_nil
+ }%
{}%
\CF_expsecond\CF_iffirsttokmatch{\CF_remainafterbond}[%
- {\expandafter\CF_analyseoptarg\CF_remainafterbond\_nil\CF_remainafterbond
+ {%
+ \expandafter\CF_analyseoptarg\CF_remainafterbond\_nil\CF_remainafterbond
}%
- {\let\CF_currentstringangle\CF_defaultstringangle
+ {%
+ \let\CF_currentstringangle\CF_defaultstringangle
\let\CF_currentlength\CF_defaultlength
\let\CF_currentfromatom\CF_defaultfromatom
\let\CF_currenttoatom\CF_defaulttoatom
\let\CF_currenttikz\CF_defaulttikz
\let\CF_movebondname\empty
}%
- \ifCF_incycle
+ \ifCF_in_cycle
\pgfmathsetmacro\CF_cycleincrementangle{360/\CF_cyclenum+\CF_initcycleangle}%
\edef\CF_currentstringangle{::+\CF_cycleincrementangle}%
\def\CF_initcycleangle{0}%
@@ -667,9 +794,11 @@
\def\CF_setbondangle#1#2{% le code de la direction est contenu dans #1, en sortie, #2 contient l'angle
\CF_ifempty{#1}%
- {\let#2\CF_defaultangle
+ {%
+ \let#2\CF_defaultangle
}
- {\if:\expandafter\noexpand\CF_firsttonil#1\_nil
+ {%
+ \if:\expandafter\noexpand\CF_firsttonil#1\_nil
\if:\CF_threeea\noexpand\expandafter\CF_firsttonil\CF_gobarg#1\_nil
\pgfmathsetmacro#2{\CF_previousangle+\expandafter\CF_gobarg\CF_gobarg#1}%
\else
@@ -688,22 +817,32 @@
}
\def\CF_analysemovearg#1,#2\_nil#3{%
- \def#3{#1}\def\CF_movebondcoeff{#2}%
+ \def#3{#1}%
+ \def\CF_movebondcoeff{#2}%
}
% Argument limités légitimes ici car #2 (qui est ce qui suit "@{<nom>}" dans l'argument optionnel) ne DOIT PAS
% commencer par une accolade.
\def\CF_grabmovearg @#1#2\_nil{%
\CF_ifinstr{#1},%
- {\CF_analysemovearg#1\_nil\CF_movebondname}%
- {\def\CF_movebondname{#1}\def\CF_movebondcoeff{0.5}}%
+ {%
+ \CF_analysemovearg#1\_nil\CF_movebondname
+ }%
+ {%
+ \def\CF_movebondname{#1}%
+ \def\CF_movebondcoeff{0.5}%
+ }%
\def\CF_remainoptarg{#2}%
}
\def\CF_testemptyandassign#1#2#3{%
\CF_ifempty{#2}
- {\let#1#3}
- {\def#1{#2}}%
+ {%
+ \let#1#3%
+ }
+ {%
+ \def#1{#2}%
+ }%
}
\def\CF_parseoptlist#1,#2,#3,#4,#5\_nil{%
@@ -716,10 +855,13 @@
\def\CF_analyseoptarg[#1]{%
\CF_doifnotempty{#1}%
- {\CF_iffirsttokmatch{#1}{@}%
- {\CF_grabmovearg#1\_nil
+ {%
+ \CF_iffirsttokmatch{#1}{@}%
+ {%
+ \CF_grabmovearg#1\_nil
}
- {\let\CF_movebondname\empty
+ {%
+ \let\CF_movebondname\empty
\def\CF_remainoptarg{#1}%
}%
\expandafter\CF_parseoptlist\CF_remainoptarg,\empty,\empty,\empty,\empty\_nil
@@ -731,34 +873,37 @@
\CF_expsecond{\def#2}{\CF_gobarg#1}%
}
-\def\CF_seeksubmol#1#2{% cherche et remplace ! au début de #1. #1=code #2=macro recevant le résultat
+\def\CF_searchsubmol#1#2{% cherche et remplace ! au début de #1. #1=code #2=macro recevant le résultat
\def\CF_seeksubmloltemp{#1}%
- \CF_seeksubmola
+ \CF_searchsubmola
\let#2\CF_seeksubmloltemp
}
-\def\CF_seeksubmola{%
+\def\CF_searchsubmola{%
\CF_expsecond{\def\CF_seeksubmloltemp}{\romannumeral-`\.\expandafter\noexpand\CF_seeksubmloltemp}%
\CF_expsecond\CF_iffirsttokmatch{\CF_seeksubmloltemp}!%
- {\CF_eexpsecond{\def\CF_seeksubmloltemp}{\expandafter\CF_gobarg\CF_seeksubmloltemp}% enlève le "!"
+ {%
+ \CF_eexpsecond{\def\CF_seeksubmloltemp}{\expandafter\CF_gobarg\CF_seeksubmloltemp}% enlève le "!"
\CF_ifx\empty\CF_seeksubmloltemp
- {\CF_error{no submol name found after "!"}}
+ {%
+ \CF_error{no submol name found after "!"}%
+ }
{}%
\ifcat\relax\CF_threeea\noexpand\expandafter\CF_firsttonil\CF_seeksubmloltemp*\_nil
- \expandafter\CF_seeksubmolb\CF_seeksubmloltemp\_nil
+ \expandafter\CF_searchsubmolb\CF_seeksubmloltemp\_nil
\else
- \expandafter\CF_seeksubmolc\CF_seeksubmloltemp\_nil
+ \expandafter\CF_searchsubmolc\CF_seeksubmloltemp\_nil
\fi
- \CF_seeksubmola
+ \CF_searchsubmola
}%
{}%
}
-\def\CF_seeksubmolb#1{\CF_seeksubmold#1\relax}
+\def\CF_searchsubmolb#1{\CF_searchsubmold#1\relax}
-\def\CF_seeksubmolc#1{\expandafter\CF_seeksubmold\csname CF__#1\endcsname\relax}% nom de la sous molécule
+\def\CF_searchsubmolc#1{\expandafter\CF_searchsubmold\csname CF__#1\endcsname\relax}% nom de la sous molécule
-\def\CF_seeksubmold#1#2\_nil{%#1=macro de la sous molécule #2=reste du code commençant par \relax
+\def\CF_searchsubmold#1#2\_nil{% #1=macro de la sous molécule #2=reste du code commençant par \relax
\CF_expsecond{\CF_eexpsecond{\def\CF_seeksubmloltemp}}{\expandafter#1\CF_gobarg#2}% supprime le \relax puis ajoute la macro au début et la 2-développe
}
@@ -779,10 +924,12 @@
\begingroup
\setchemfig{#3}%
\CF_ifinsidetikz
- {\pgfinterruptpicture
+ {%
+ \pgfinterruptpicture
\let\CF_atendofchemfig\endpgfinterruptpicture
}
- {\let\CF_atendofchemfig\relax
+ {%
+ \let\CF_atendofchemfig\relax
}%
\expanded{% début du tikzpicture
\unexpanded{#1}[%
@@ -801,18 +948,32 @@
\begingroup% \endgroup rajouté en sortie de tracé par \CF_chemfigd
\let\CF_hooklist\empty
\ifboolKV[chemfig]{fixed length}
- {\CF_macrofixedbondlengthtrue}
- {\CF_macrofixedbondlengthfalse}%
+ {%
+ \CF_macro_fixed_bond_lengthtrue
+ }
+ {%
+ \CF_macro_fixed_bond_lengthfalse
+ }%
\ifboolKV[chemfig]{bond join}
- {\let\CF_drawaxisbond\CF_drawaxisbondjoin}
- {\let\CF_drawaxisbond\CF_drawaxisbondnojoin}%
+ {%
+ \let\CF_drawaxisbond\CF_drawaxisbondjoin
+ }
+ {%
+ \let\CF_drawaxisbond\CF_drawaxisbondnojoin
+ }%
\ifboolKV[chemfig]{cram rectangle}
- {\let\CF_clipcramornot\CF_gobtikzinstruction}
- {\let\CF_clipcramornot\clip}%
- \CF_incyclefalse
- \CF_cntgroup0
+ {%
+ \let\CF_clipcramornot\CF_gobtikzinstruction
+ }
+ {%
+ \let\CF_clipcramornot\clip
+ }%
+ \CF_in_cyclefalse
+ \CF_cnt_group0
\ifboolKV[chemfig]{autoreset cntcycle}
- {\global\CF_cntcycle0 }
+ {%
+ \global\CF_cnt_cycle0
+ }
{}%
\let\CF_lastaction\CF_zero% 0=début du dessin 1=tracé d'un noeud 2=tracé d'une liaison
\let\CF_startoffset\empty
@@ -842,10 +1003,10 @@
\def\CF_chemfigc#1{% #1 est le code de la molécule
\ifnum\CF_lastaction=3
- \ifCF_incycle
+ \ifCF_in_cycle
\def\CF_defaultangle{0}%
\else
- \ifnum\CF_cntcyclebonds=0 % si c'est le début d'un cycle
+ \ifnum\CF_cnt_cyclebonds=0 % si c'est le début d'un cycle
\pgfmathsetmacro\CF_defaultangle{\CF_previousangle+180+\CF_cycleanglecorrection}% on met la liaison à +180° + correction
\else
\pgfmathsetmacro\CF_defaultangle{\CF_previousangle-90+180/\CF_cyclenum}% sinon à la bissectrice du sommet du cycle
@@ -855,7 +1016,7 @@
\fi
\let\CF_currentangle\CF_defaultangle
\def\CF_molecule{#1}%
- \CF_expsecond\CF_seeksubmol\CF_molecule\CF_molecule% alias en premier ?
+ \CF_expsecond\CF_searchsubmol\CF_molecule\CF_molecule% alias en premier ?
\if[\CF_threeea\noexpand\expandafter\CF_firsttonil\CF_molecule\_nil
\expandafter\CF_analyseoptarg\CF_molecule\_nil\CF_molecule
\CF_expsecond\CF_setbondangle{\CF_currentstringangle}\CF_currentangle
@@ -866,25 +1027,27 @@
\CF_doifnotempty\CF_currentfromatom {\let\CF_defaultfromatom\CF_currentfromatom}%
\CF_doifnotempty\CF_currenttoatom {\let\CF_defaulttoatom\CF_currenttoatom}%
\CF_doifnotempty\CF_currenttikz {\let\CF_defaulttikz\CF_currenttikz}%
- \CF_expsecond\CF_seeksubmol\CF_molecule\CF_molecule
+ \CF_expsecond\CF_searchsubmol\CF_molecule\CF_molecule
\fi
\edef\CF_defaultstringangle{:\CF_defaultangle}%
\let\CF_currentlength\CF_defaultlength
\let\CF_currentfromatom\CF_defaultfromatom
\let\CF_currenttoatom\CF_defaulttoatom
\let\CF_currenttikz\CF_defaulttikz
- \ifCF_incycle% si on commence un cycle
+ \ifCF_in_cycle% si on commence un cycle
\let\CF_currentangle\CF_previousangle
- \pgfmathsetmacro\CF_cyclearcinitangle{\CF_currentangle+\CF_initcycleangle+180/\CF_cyclenum+90}%
+ \pgfmathsetmacro\CF_cycle_arcinitangle{\CF_currentangle+\CF_initcycleangle+180/\CF_cyclenum+90}%
\pgfmathsetmacro\CF_centeroffset{\CF_currentlength*\CF_atomsep/(2*sin(180/\CF_cyclenum))}%
- \node[at=(\CF_bondoutnode),shift=(\CF_cyclearcinitangle:\CF_centeroffset pt),anchor=center](cyclecenter\number\CF_cntcycle){};% le centre du cycle
+ \node[at=(\CF_bondoutnode),shift=(\CF_cycle_arcinitangle:\CF_centeroffset pt),anchor=center](cyclecenter\number\CF_cnt_cycle){};% le centre du cycle
\ifboolKV[chemfig]{show cntcycle}
- {\node[at=(cyclecenter\number\CF_cntcycle),anchor=center,overlay]{\tiny\number\CF_cntcycle};}
+ {%
+ \node[at=(cyclecenter\number\CF_cnt_cycle),anchor=center,overlay]{\tiny\number\CF_cnt_cycle};%
+ }
{}%
- \ifCF_cyclearc% on doit tracer l'arc de cercle dans le cycle ?
- \pgfmathsetmacro\CF_cyclearcradius{\CF_cycleradiuscoeff*\CF_currentlength*\CF_atomsep/(2*tan(180/\CF_cyclenum))}%
- \node[at=(cyclecenter\number\CF_cntcycle),shift=(\CF_cyclearcstartangle:\CF_cyclearcradius pt)](initarc){};% le début de l'arc
- \CF_expafter{\draw[}\CF_cyclearcdirecttikz](initarc) arc (\CF_cyclearcstartangle:\CF_cyclearcendangle:\CF_cyclearcradius pt);%
+ \ifCF_cycle_arc% on doit tracer l'arc de cercle dans le cycle ?
+ \pgfmathsetmacro\CF_cycle_arcradius{\CF_cycleradiuscoeff*\CF_currentlength*\CF_atomsep/(2*tan(180/\CF_cyclenum))}%
+ \node[at=(cyclecenter\number\CF_cnt_cycle),shift=(\CF_cycle_arcstartangle:\CF_cycle_arcradius pt)](initarc){};% le début de l'arc
+ \CF_expafter{\draw[}\CF_cycle_arcdirecttikz](initarc) arc (\CF_cycle_arcstartangle:\CF_cycle_arcendangle:\CF_cycle_arcradius pt);%
\fi
\else
\let\CF_currentangle\CF_defaultangle
@@ -893,7 +1056,9 @@
\let\CF_previousangle\CF_defaultangle
\node(CF_node){};
\CF_expsecond\CF_iffirsttokin{\CF_molecule}{-=(*~?<>}%
- {\CF_insertemptygroup\CF_molecule}%
+ {%
+ \CF_insertemptygroup\CF_molecule
+ }%
{}%
\fi
\CF_chemfigd
@@ -902,18 +1067,21 @@
\def\CF_chemfigd{%
\let\CF_nextaction\CF_chemfigd% à priori, on reboucle
\CF_ifx\CF_molecule\empty
- {\let\CF_nextaction\endgroup
+ {%
+ \let\CF_nextaction\endgroup
}
- {\CF_expsecond\CF_seeknode{\CF_molecule}\CF_currentatomgroup\CF_molecule
+ {%
+ \CF_expsecond\CF_searchnode{\CF_molecule}\CF_currentatomgroup\CF_molecule
\CF_ifx\empty\CF_currentatomgroup% pas de noeud pour commencer ?
- {\def\CF_bondoutnode{%
+ {%
+ \def\CF_bondoutnode{%
n\CF_lastgroupnumber-%
\ifx\CF_currentfromatom\empty
\ifdim\CF_currentangle pt<90pt
- \number\CF_cntatomgroup
+ \number\CF_cnt_atomgroup
\else
\ifdim\CF_currentangle pt>270pt
- \number\CF_cntatomgroup
+ \number\CF_cnt_atomgroup
\else
1%
\fi
@@ -923,21 +1091,22 @@
\fi}%
\CF_expafter{\futurelet\CF_toksa\CF_gobtonil}{\CF_molecule\relax\_nil}%
\CF_iffirsttokina{-=<>~}% la suite est une liaison
- {\ifnum\CF_lastaction=2 % c'est la deuxième liaison consécutive ?
+ {%
+ \ifnum\CF_lastaction=2 % c'est la deuxième liaison consécutive ?
\CF_insertemptygroup\CF_molecule% insère un groupe vide
\edef\CF_bondoutnode{\CF_bondoutnode}%
\else
- \ifCF_incycle
- \advance\CF_cntcyclebonds1
+ \ifCF_in_cycle
+ \advance\CF_cnt_cyclebonds1
\fi
\CF_expsecond\CF_analysebond{\CF_molecule}\CF_bondtype
\edef\CF_bondoutnode{\CF_bondoutnode}%
\let\CF_molecule\CF_remainafterbond
- \ifCF_incycle
- \ifnum\CF_cntcyclebonds=\CF_cyclenum\relax
+ \ifCF_in_cycle
+ \ifnum\CF_cnt_cyclebonds=\CF_cyclenum\relax
\CF_threeea\CF_execfirst
\else
- \ifnum\CF_cntcyclebonds=1
+ \ifnum\CF_cnt_cyclebonds=1
\let\CF_cyclefirsttikz\CF_currenttikz
\CF_doifnotempty\CF_startoffset{\let\CF_cyclejoinlast\CF_zero}%
\fi
@@ -946,12 +1115,14 @@
\else
\expandafter\CF_execsecond
\fi
- {\let\CF_nextaction\endgroup
+ {%
+ \let\CF_nextaction\endgroup
\CF_drawbond\CF_bondtype{\CF_bondoutnode}{\CF_hookcycle}\CF_previousatomgroup\CF_hookatomgroup
}%
- {\node[at=(\CF_bondoutnode\ifCF_incycle\else\ifCF_macrofixedbondlength.\CF_currentangle\fi\fi),shift=(\ifcase\CF_flipstate\or180-\or-\fi\CF_currentangle:\CF_currentlength*\CF_atomsep)](CF_node){};
+ {%
+ \node[at=(\CF_bondoutnode\ifCF_in_cycle\else\ifCF_macro_fixed_bond_length.\CF_currentangle\fi\fi),shift=(\ifcase\CF_flipstate\or180-\or-\fi\CF_currentangle:\CF_currentlength*\CF_atomsep)](CF_node){};
\let\CF_previousangle\CF_currentangle
- \def\CF_lastaction{2}%
+ \def\CF_lastaction{2}% on a tracé une liaison
}%
\fi
\ifcat\relax\detokenize\expandafter{\romannumeral-`\.\expandafter\noexpand\CF_molecule}\relax
@@ -959,55 +1130,69 @@
\CF_insertemptygroup\CF_molecule
\fi
}%
- {\edef\CF_bondoutnode{\CF_bondoutnode}% évalue le l'atome de départ de liaison
+ {%
+ \edef\CF_bondoutnode{\CF_bondoutnode}% évalue le l'atome de départ de liaison
\CF_ifx(\CF_toksa% une parenthèse pour commencer ?
- {\ifnum\CF_lastaction=2 % il y avait une liaison juste avant ?
+ {%
+ \ifnum\CF_lastaction=2 % il y avait une liaison juste avant ?
\CF_insertemptygroup\CF_molecule
\else
\CF_expsecond\CF_grabsubmol{\CF_molecule}%
\begingroup
- \ifCF_incycle\def\CF_lastaction{3}\fi% on était dans un cycle
- \CF_incyclefalse
+ \ifCF_in_cycle\def\CF_lastaction{3}\fi% on était dans un cycle
+ \CF_in_cyclefalse
\aftergroup\CF_chemfigd
\def\CF_nextaction{\CF_expsecond\CF_chemfigc{\CF_molinparen}}%
\fi
}%
- {\CF_ifx\CF_molecule\empty
- {\let\CF_nextaction\endgroup
+ {%
+ \CF_ifx\CF_molecule\empty
+ {%
+ \let\CF_nextaction\endgroup
}
{% ce qui reste après le noeud courant n'est pas vide, ne commence pas par "-=~", ni par une parenthèse
\CF_ifx*\CF_toksa% un cycle ?
- {\ifnum\CF_lastaction=2
+ {%
+ \ifnum\CF_lastaction=2
+ \def\CF_currentfromatom{1}% Bugfix 1.6e
\CF_insertemptygroup\CF_molecule% insère un groupe vide
\else
- \ifCF_incycle
+ \ifCF_in_cycle
\def\CF_lastaction{3}%
\fi% on était dans un cycle
\ifnum\CF_lastaction=3
\let\CF_lastcyclenum\CF_cyclenum
\fi
\CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_molecule}*%
- {\CF_eexpsecond{\def\CF_molecule}{\expandafter\CF_gobarg\CF_molecule}% enlève la 1er étoile
+ {%
+ \CF_eexpsecond{\def\CF_molecule}{\expandafter\CF_gobarg\CF_molecule}% enlève la 1er étoile
\CF_eexpsecond\CF_iffirsttokmatch{\expandafter\CF_gobarg\CF_molecule}[% un crochet ensuite ?
- {\expandafter\CF_cycleparsepreamblewithoptarg\CF_molecule\_nil% \begingroup inclus
+ {%
+ \expandafter\CF_parsecyclepreamblewithoptarg\CF_molecule\_nil% \begingroup inclus
}%
- {\def\CF_cyclearcstartangle{0}\def\CF_cyclearcendangle{360}%
- \let\CF_cyclearcdirecttikz\empty
- \expandafter\CF_cycleparsepreamble\CF_molecule\_nil% \begingroup inclus
+ {%
+ \def\CF_cycle_arcstartangle{0}\def\CF_cycle_arcendangle{360}%
+ \let\CF_cycle_arcdirecttikz\empty
+ \expandafter\CF_parsecyclepreamble\CF_molecule\_nil% \begingroup inclus
}%
- \CF_cyclearctrue
+ \CF_cycle_arctrue
}%
- {\expandafter\CF_cycleparsepreamble\CF_molecule\_nil% \begingroup inclus
- \CF_cyclearcfalse
+ {%
+ \expandafter\CF_parsecyclepreamble\CF_molecule\_nil% \begingroup inclus
+ \CF_cycle_arcfalse
}%
- \CF_cntcyclebonds0
+ \CF_cnt_cyclebonds0
\edef\CF_hookcycle{\CF_bondoutnode}%
\let\CF_hookatomgroup\CF_previousatomgroup
\CF_ifzerodim\CF_hookatomgroup
- {\def\CF_cyclejoinlast{1}}% joindre le dernier
- {\def\CF_cyclejoinlast{0}}%
- \CF_incycletrue
- \global\advance\CF_cntcycle1
+ {%
+ \def\CF_cyclejoinlast{1}% joindre le dernier
+ }%
+ {%
+ \def\CF_cyclejoinlast{0}%
+ }%
+ \CF_in_cycletrue
+ \global\advance\CF_cnt_cycle1
\ifnum\CF_lastaction=3
\pgfmathsetmacro\CF_initcycleangle{360/\CF_lastcyclenum-180}% c'est un cycle dans un cycle
\else
@@ -1017,19 +1202,21 @@
\def\CF_nextaction{\CF_expsecond\CF_chemfigc{\CF_molinparen}}%
\fi
}%
- {\CF_error{something went wrong here: \detokenize\expandafter{\CF_molecule}^^JIf you think it's a bug, please, send a Minimal Example to the author}%
+ {%
+ \CF_error{something went wrong here: \detokenize\expandafter{\CF_molecule}^^JIf you think it's a bug, please, send a Minimal Example to the author}%
}%
}%
}%
}%
}%
- {\CF_expthreemacroargs\CF_drawatomgroup\CF_currentangle\CF_currenttoatom\CF_currentatomgroup
+ {%
+ \CF_expthreemacroargs\CF_drawatomgroup\CF_currentangle\CF_currenttoatom\CF_currentatomgroup
}%
}%
\CF_nextaction
}
-\def\CF_cycleparsepreamble*#1#2\_nil{%
+\def\CF_parsecyclepreamble*#1#2\_nil{%
\ifnum#1<3
\CF_error{a cycle must be at least a triangle.^^JThe number following "*" must be 3 or more}%
\fi
@@ -1039,19 +1226,27 @@
\def\CF_cyclenum{#1}%
}
-\def\CF_cycleparsepreamblewithoptarg*[#1]#2#3\_nil{%
+\def\CF_parsecyclepreamblewithoptarg*[#1]#2#3\_nil{%
\CF_cycleparseoptarg#1,\empty,\empty,\empty\_nil
- \CF_cycleparsepreamble*#2#3\_nil
+ \CF_parsecyclepreamble*#2#3\_nil
}
\def\CF_cycleparseoptarg#1,#2,#3\_nil{%
\CF_ifempty{#1}
- {\def\CF_cyclearcstartangle{0}}
- {\def\CF_cyclearcstartangle{#1}}%
+ {%
+ \def\CF_cycle_arcstartangle{0}%
+ }
+ {%
+ \def\CF_cycle_arcstartangle{#1}%
+ }%
\CF_ifempty{#2}
- {\def\CF_cyclearcendangle{360}}
- {\def\CF_cyclearcendangle{#2}}%
- \CF_expsecond{\def\CF_cyclearcdirecttikz}{\CF_sanitizelastitem#3,\empty\_nil}%
+ {%
+ \def\CF_cycle_arcendangle{360}%
+ }
+ {%
+ \def\CF_cycle_arcendangle{#2}%
+ }%
+ \CF_expsecond{\def\CF_cycle_arcdirecttikz}{\CF_sanitizelastitem#3,\empty\_nil}%
}
\def\CF_grabsubmol#1{%
@@ -1088,12 +1283,14 @@
% à une distance de #3 du noeud #1 et #4 du noeud #2
\def\CF_createnormnodes#1#2#3#4{%
\CF_doifnotempty{#3}
- {\node[shape=coordinate,at=(#1),xshift=#3*\CF_normx,yshift=#3*\CF_normy](#11){};
- \node[shape=coordinate,at=(#1),xshift=-#3*\CF_normx,yshift=-#3*\CF_normy](#12){};
+ {%
+ \node[shape=coordinate,at=(#1),xshift=#3*\CF_normx,yshift=#3*\CF_normy](#11){};%
+ \node[shape=coordinate,at=(#1),xshift=-#3*\CF_normx,yshift=-#3*\CF_normy](#12){};%
}%
\CF_doifnotempty{#4}
- {\node[shape=coordinate,at=(#2),xshift=#4*\CF_normx,yshift=#4*\CF_normy](#21){};
- \node[shape=coordinate,at=(#2),xshift=-#4*\CF_normx,yshift=-#4*\CF_normy](#22){};
+ {%
+ \node[shape=coordinate,at=(#2),xshift=#4*\CF_normx,yshift=#4*\CF_normy](#21){};%
+ \node[shape=coordinate,at=(#2),xshift=-#4*\CF_normx,yshift=-#4*\CF_normy](#22){};%
}%
}
@@ -1114,8 +1311,12 @@
\def\CF_setoffset#1#2{%
\CF_doifempty#1{%
\CF_ifzerodim{#2}
- {\def#1{0pt}}
- {\edef#1{\CF_bondoffset}}%
+ {%
+ \def#1{0pt}%
+ }
+ {%
+ \edef#1{\CF_bondoffset}%
+ }%
}%
}
@@ -1130,7 +1331,8 @@
\pgfmathsetmacro\CF_endcoeff{1-\CF_endoffset/\CF_vectorlen}%
\path(#2@)--(#3@)coordinate[pos=\CF_startcoeff](#2@@)coordinate[pos=\CF_endcoeff](#3@@);%
\CF_doifnotempty\CF_movebondname% on doit poser un noeud sur la liaison
- {\path(#2@@)--(#3@@)coordinate[overlay,pos=\CF_movebondcoeff](\CF_movebondname);
+ {%
+ \path(#2@@)--(#3@@)coordinate[overlay,pos=\CF_movebondcoeff](\CF_movebondname);
\let\CF_movebondname\empty
}%
\ifcase#1\relax
@@ -1138,7 +1340,7 @@
\or% 1 = liaison simple
\CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe
\or% 2 = liaison double
- \ifCF_incycle
+ \ifCF_in_cycle
\ifnum\CF_doublebondtype=0
\def\CF_doublebondtype{1}%
\fi
@@ -1156,7 +1358,7 @@
\CF_createnormnodes{#2@@}{#3@@}\CF_doublesep\CF_doublesep
\CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe\CF_drawbonda(#2@@)--(#3@@);
\begingroup% ajuste éventuellement les longueurs des liaisons doubles
- \ifCF_incycle
+ \ifCF_in_cycle
\ifdim\CF_startoffset=0pt
\CF_edefaddtomacro\CF_currentbondstyle{,shorten <=\CF_doublebondlengthcorrection pt}%
\fi
@@ -1170,7 +1372,7 @@
\CF_createnormnodes{#2@@}{#3@@}\CF_doublesep\CF_doublesep
\CF_drawaxisbond{#2}{#3}% trace la liaison simple dans l'axe\CF_drawbonda(#2@@)--(#3@@);
\begingroup% ajuste éventuellement les longueurs des liaisons doubles
- \ifCF_incycle
+ \ifCF_in_cycle
\ifdim\CF_startoffset=0pt
\CF_edefaddtomacro\CF_currentbondstyle{,shorten \ifnum\CF_flipstate=0 <=-\else>=\fi\CF_doublebondlengthcorrection pt}%
\fi
@@ -1229,12 +1431,12 @@
\def\CF_drawaxisbondnojoin#1#2{\CF_drawbonda(#1@@)--(#2@@);}
\def\CF_drawaxisbondjoin#1#2{% dessine une liaison simple dans l'axe avec raccord rétrograde
- \ifCF_incycle\ifnum\CF_cntcyclebonds=\CF_cyclenum\relax
+ \ifCF_in_cycle\ifnum\CF_cnt_cyclebonds=\CF_cyclenum\relax
\let\CF_nexttikz\CF_cyclefirsttikz
\fi\fi
\ifnum\CF_joinbond=0
- \ifCF_incycle
- \ifnum\CF_cntcyclebonds=\CF_cyclenum\relax
+ \ifCF_in_cycle
+ \ifnum\CF_cnt_cyclebonds=\CF_cyclenum\relax
\ifnum\CF_cyclejoinlast=1
\CF_drawbonda(#1@@)--(#2@@)--%
([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@);
@@ -1250,20 +1452,25 @@
\def\CF_joinbond{1}%
\else
\CF_ifx\CF_previoustikz\CF_currenttikz
- {\def\CF_joinbond{1}%
+ {%
+ \def\CF_joinbond{1}%
\CF_ifzerodim\CF_previousatomgroup
- {\CF_ifx\CF_previousbondangle\empty% si début molécule
- {\CF_drawbonda(#1@@)--(#2@@);
+ {%
+ \CF_ifx\CF_previousbondangle\empty% si début molécule
+ {%
+ \CF_drawbonda(#1@@)--(#2@@);
}
- {\ifdim\CF_startoffset=0pt
- \ifCF_incycle
- \ifnum\CF_cntcyclebonds=\CF_cyclenum\relax
+ {%
+ \ifdim\CF_startoffset=0pt
+ \ifCF_in_cycle
+ \ifnum\CF_cnt_cyclebonds=\CF_cyclenum\relax
\ifnum\CF_cyclejoinlast=1
\CF_ifx\CF_cyclefirsttikz\CF_currenttikz
- {\CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@)--%
- ([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@);
+ {%
+ \CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@)--([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@);
}
- {\CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@);
+ {%
+ \CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@);
}%
\else
\CF_drawbonda([shift=(\CF_previousbondangle:-.5\pgflinewidth)]#1@@)--(#1@@)--(#2@@);
@@ -1279,14 +1486,21 @@
\fi
}%
}
- {\CF_drawbonda(#1@@)--(#2@@);}%
+ {%
+ \CF_drawbonda(#1@@)--(#2@@);%
+ }%
}
- {\ifCF_incycle
- \ifnum\CF_cntcyclebonds=\CF_cyclenum\relax
+ {%
+ \ifCF_in_cycle
+ \ifnum\CF_cnt_cyclebonds=\CF_cyclenum\relax
\ifnum\CF_cyclejoinlast=1
\CF_ifx\CF_nexttikz\CF_currenttikz
- {\CF_drawbonda(#1@@)--(#2@@)--([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@);}%
- {\CF_drawbonda(#1@@)--(#2@@);}%
+ {%
+ \CF_drawbonda(#1@@)--(#2@@)--([shift=(\CF_previousbondangle+2*\CF_cycleincrementangle:.5\pgflinewidth)]#2@@);%
+ }%
+ {%
+ \CF_drawbonda(#1@@)--(#2@@);%
+ }%
\else
\CF_drawbonda(#1@@)--(#2@@);
\fi
@@ -1305,23 +1519,26 @@
\def\CF_drawbonda{\CF_expafter{\draw[}\CF_currentbondstyle]}
-\def\CF_hookdrawall{% dessine tous les crochets contenus dans la sc \CF_hookdraw
+\def\CF_drawallhooks{% dessine tous les crochets contenus dans la sc \CF_hookdraw
\CF_doifnotempty\CF_hookdrawlist
- {\expandafter\CF_hookdrawfirst\CF_hookdrawlist\_nil% trace un lien de crochet à crochet
- \CF_hookdrawall
+ {%
+ \expandafter\CF_drawfirsthook\CF_hookdrawlist\_nil% trace un lien de crochet à crochet
+ \CF_drawallhooks
}%
}
-\def\CF_hookdrawfirst[#1,#2,#3]#4#5#6#7#8\_nil{%
+\def\CF_drawfirsthook[#1,#2,#3]#4#5#6#7#8\_nil{%
\def\CF_hookdrawlist{#8}%
\begingroup
\let\CF_joinbond\CF_zero
\def\CF_currenttikz{#3}%
\def\CF_hookstartcontent{#6}\def\CF_hookendcontent{#7}%
\CF_ifinteger{#2}%
- {\CF_drawbond{#2}{#4}{#5}\CF_hookstartcontent\CF_hookendcontent
+ {%
+ \CF_drawbond{#2}{#4}{#5}\CF_hookstartcontent\CF_hookendcontent
}%
- {\CF_assignbondcode{#2}\CF_bondcurrentnum
+ {%
+ \CF_assignbondcode{#2}\CF_bondcurrentnum
\CF_drawbond\CF_bondcurrentnum{#4}{#5}\CF_hookstartcontent\CF_hookendcontent
}%
\endgroup
@@ -1330,11 +1547,18 @@
\def\CF_extractatom#1-#2\_nil{#2}% transforme le bound@outnode en n° de l'atome
\def\CF_gobblemovearg @#1#2\_nil#3{%
- \expandafter\def\csname atom_\number\CF_cntatom\endcsname{#2}%
+ \expandafter\def\csname atom_\number\CF_cnt_atom\endcsname{#2}%
\CF_ifinstr{#1},%
- {\CF_analysemovearg#1\_nil#3\let\CF_movebondcoeff\empty}%
- {\def#3{#1}}%
- \CF_doifempty{#2}{\let\CF_nodestrut\empty}%
+ {%
+ \CF_analysemovearg#1\_nil#3\let\CF_movebondcoeff\empty
+ }%
+ {%
+ \def#3{#1}%
+ }%
+ \CF_doifempty{#2}
+ {%
+ \let\CF_nodestrut\empty
+ }%
}%
\def\hflipnext{\def\CF_flipstate{1}}
@@ -1351,36 +1575,43 @@
empty%
\fi
\endcsname
- \global\advance\CF_cntgroup1
+ \global\advance\CF_cnt_group1
\let\CF_currentatom\empty
\global\let\CF_hookdrawlist\empty
- \CF_cntatomgroup0 % est le nombre d'atome dans le groupe que va calculer \CF_drawatomgroupa
- \CF_iffirsttokmatch{#3}?
- {\CF_drawatomgroupa{{}#3}}
- {\CF_drawatomgroupa{#3}}%
+ \CF_cnt_atomgroup0 % est le nombre d'atome dans le groupe que va calculer \CF_drawatomgroupa
+ \CF_iffirsttokmatch{#3}?%
+ {%
+ \CF_drawatomgroupa{{}#3}%
+ }
+ {%
+ \CF_drawatomgroupa{#3}%
+ }%
\def\CF_currentatomgroup{#3}%
\CF_removemovearg\CF_currentatomgroup% enlève les "@{<nom>}"
\CF_ifinstr{#3}?%
- {\CF_removehook\CF_currentatomgroup
+ {%
+ \CF_removehook\CF_currentatomgroup
\ifcat\relax\detokenize\expandafter{\romannumeral-`\.\expandafter\noexpand\CF_currentatomgroup}\relax
\let\CF_currentatomgroup\empty
\fi
}%
{}%
\CF_doifnotempty{#2}
- {\ifnum#2<1
+ {%
+ \ifnum#2<1
\CF_warning{no atom found at position #2, pershaps you mispelled the optional argument of the bond.}%
\else
- \ifnum#2>\CF_cntatomgroup
+ \ifnum#2>\CF_cnt_atomgroup
\CF_error{no atom found at position #2, pershaps you mispelled the optional argument of the bond.}%
\fi
\fi
}%
\edef\CF_hookatomnumber{%
\CF_ifempty{#2}
- {\ifdim#1pt>90pt
+ {%
+ \ifdim#1pt>90pt
\ifdim#1pt<270pt
- \number\CF_cntatomgroup
+ \number\CF_cnt_atomgroup
\else
1%
\fi
@@ -1388,97 +1619,110 @@
1%
\fi
}
- {#2%
+ {%
+ #2%
}%
}%
- \CF_cntatom\CF_hookatomnumber
+ \CF_cnt_atom\CF_hookatomnumber
\CF_ifzerodim\CF_currentatomgroup
- {\let\CF_nodestrut\empty
+ {%
+ \let\CF_nodestrut\empty
}
- {\CF_ifx\empty\CF_bondoutcontentsaved
- {\def\CF_nodestrut{\vphantom\CF_bondoutcontent}}%
- {\def\CF_nodestrut{\vphantom\CF_bondoutcontentsaved}}%
+ {%
+ \CF_ifx\empty\CF_bondoutcontentsaved
+ {%
+ \def\CF_nodestrut{\vphantom\CF_bondoutcontent}%
+ }%
+ {%
+ \def\CF_nodestrut{\vphantom\CF_bondoutcontentsaved}%
+ }%
}%
- \edef\CF_optstring{anchor=\ifnum\CF_lastaction=0 base\else\ifCF_incycle center\else\ifCF_macrofixedbondlength 180+#1\else center\fi\fi\fi,at=(CF_node),\CF_nodestyle}% premier atome de la molécule affiché
+ \edef\CF_optstring{anchor=\ifnum\CF_lastaction=0 base\else\ifCF_in_cycle center\else\ifCF_macro_fixed_bond_length 180+#1\else center\fi\fi\fi,at=(CF_node),\CF_nodestyle}% premier atome de la molécule affiché
\loop
- \unless\ifnum\CF_cntatom>\CF_cntatomgroup
- \CF_eexpafter
- {\futurelet\CF_toksa}
- {\expandafter\expandafter\expandafter\CF_gobtonil\csname atom_\number\CF_cntatom\endcsname\_nil}%
+ \unless\ifnum\CF_cnt_atom>\CF_cnt_atomgroup
+ \CF_eexpafter{\futurelet\CF_toksa}{\expandafter\expandafter\expandafter\CF_gobtonil\csname atom_\number\CF_cnt_atom\endcsname\_nil}%
\CF_ifx @\CF_toksa% l'atome courant commence par un "@"
- {\CF_threeea\CF_gobblemovearg\csname atom_\number\CF_cntatom\endcsname\_nil\CF_moveatomname
+ {%
+ \CF_threeea\CF_gobblemovearg\csname atom_\number\CF_cnt_atom\endcsname\_nil\CF_moveatomname
\CF_expafter{\node[}\CF_optstring,overlay](\CF_moveatomname){\phantom{\CF_nodecontent}};%
\let\CF_moveatomname\empty
}
{}%
\ifboolKV[chemfig]{debug}
- {\CF_expafter{\node[}\CF_optstring,draw=gray](n\number\CF_cntgroup-\number\CF_cntatom){\CF_nodecontent};%
+ {%
+ \CF_expafter{\node[}\CF_optstring,draw=gray](n\number\CF_cnt_group-\number\CF_cnt_atom){\CF_nodecontent};%
\CF_show_debug_atom
}
- {\CF_expafter{\node[}\CF_optstring](n\number\CF_cntgroup-\number\CF_cntatom){\CF_nodecontent};%
+ {%
+ \CF_expafter{\node[}\CF_optstring](n\number\CF_cnt_group-\number\CF_cnt_atom){\CF_nodecontent};%
}%
\let\CF_nodestrut\empty
- \advance\CF_cntatom1
- \edef\CF_optstring{anchor=base \ifnum\CF_flipstate=1 east\else west\fi,at=(n\number\CF_cntgroup-\number\numexpr\CF_cntatom-1.base \ifnum\CF_flipstate=1 west\else east\fi),\CF_nodestyle}%
+ \advance\CF_cnt_atom1
+ \edef\CF_optstring{anchor=base \ifnum\CF_flipstate=1 east\else west\fi,at=(n\number\CF_cnt_group-\number\numexpr\CF_cnt_atom-1.base \ifnum\CF_flipstate=1 west\else east\fi),\CF_nodestyle}%
\repeat
- \CF_cntatom\CF_hookatomnumber
+ \CF_cnt_atom\CF_hookatomnumber
\ifnum\CF_lastaction=2 % s'il faut tracer une liaison
\gdef\CF_cycleanglecorrection{0}% alors c'est qu'un cycle ne peut pas commencer la molécule : annulation de la correction d'angle
- \CF_drawbond\CF_bondtype{\CF_bondoutnode}{n\number\CF_cntgroup-\number\CF_cntatom}\CF_previousatomgroup\CF_currentatomgroup
+ \CF_drawbond\CF_bondtype{\CF_bondoutnode}{n\number\CF_cnt_group-\number\CF_cnt_atom}\CF_previousatomgroup\CF_currentatomgroup
\fi
\def\CF_lastaction{1}% met la dernière action à 1 : affichage d'un noeud
\loop
- \ifnum\CF_cntatom>1
- \advance\CF_cntatom-1
- \edef\CF_optstring{anchor=base \ifnum\CF_flipstate=1 west\else east\fi,at=(n\number\CF_cntgroup-\number\numexpr\CF_cntatom+1.base \ifnum\CF_flipstate=1 east\else west\fi),\CF_nodestyle}%
- \CF_eexpafter
- {\futurelet\CF_toksa}
- {\expandafter\expandafter\expandafter\CF_gobtonil\csname atom_\number\CF_cntatom\endcsname\_nil}%
+ \ifnum\CF_cnt_atom>1
+ \advance\CF_cnt_atom-1
+ \edef\CF_optstring{anchor=base \ifnum\CF_flipstate=1 west\else east\fi,at=(n\number\CF_cnt_group-\number\numexpr\CF_cnt_atom+1.base \ifnum\CF_flipstate=1 east\else west\fi),\CF_nodestyle}%
+ \CF_eexpafter{\futurelet\CF_toksa}{\expandafter\expandafter\expandafter\CF_gobtonil\csname atom_\number\CF_cnt_atom\endcsname\_nil}%
\CF_ifx @\CF_toksa% l'atome courant commence par un "@"
- {\CF_threeea\CF_gobblemovearg\csname atom_\number\CF_cntatom\endcsname\_nil\CF_moveatomname
+ {%
+ \CF_threeea\CF_gobblemovearg\csname atom_\number\CF_cnt_atom\endcsname\_nil\CF_moveatomname
\CF_expafter{\node[}\CF_optstring,overlay](\CF_moveatomname){\phantom{\CF_nodecontent}};%
\let\CF_moveatomname\empty
}
{}%
\ifboolKV[chemfig]{debug}
- {\CF_expafter{\node[}\CF_optstring,draw=gray](n\number\CF_cntgroup-\number\CF_cntatom){\CF_nodecontent};%
+ {%
+ \CF_expafter{\node[}\CF_optstring,draw=gray](n\number\CF_cnt_group-\number\CF_cnt_atom){\CF_nodecontent};%
\CF_show_debug_atom
}
- {\CF_expafter{\node[}\CF_optstring](n\number\CF_cntgroup-\number\CF_cntatom){\CF_nodecontent};%
+ {%
+ \CF_expafter{\node[}\CF_optstring](n\number\CF_cnt_group-\number\CF_cnt_atom){\CF_nodecontent};%
}%
\repeat
\ifboolKV[chemfig]{debug}
\CF_show_debug_atomgroup
{}%
- \CF_hookdrawall
- \edef\CF_lastgroupnumber{\number\CF_cntgroup}%
+ \CF_drawallhooks
+ \edef\CF_lastgroupnumber{\number\CF_cnt_group}%
\let\CF_previousatomgroup\CF_currentatomgroup
}
\def\CF_show_debug_atom{%
- \node[at=(n\number\CF_cntgroup-\number\CF_cntatom.south),anchor=north,outer sep=1pt,overlay]{$\scriptscriptstyle\color{gray}\number\CF_cntatom$};%
+ \node[at=(n\number\CF_cnt_group-\number\CF_cnt_atom.south),anchor=north,outer sep=1pt,overlay]{$\scriptscriptstyle\color{gray}\number\CF_cnt_atom$};%
}
\def\CF_show_debug_atomgroup{%
- \draw[red,overlay] ([xshift=-.5pt,yshift=.5pt]n\number\CF_cntgroup-1.north west) rectangle ([xshift=.5pt,yshift=-.5pt]n\number\CF_cntgroup-\number\CF_cntatomgroup.south east);%
- \path (n\number\CF_cntgroup-1.north west) -- (n\number\CF_cntgroup-\number\CF_cntatomgroup.north east)
- node [midway,yshift=1pt,overlay] {$\scriptscriptstyle\color{red}\number\CF_cntgroup$};
+ \draw[red,overlay] ([xshift=-.5pt,yshift=.5pt]n\number\CF_cnt_group-1.north west) rectangle ([xshift=.5pt,yshift=-.5pt]n\number\CF_cnt_group-\number\CF_cnt_atomgroup.south east);%
+ \path (n\number\CF_cnt_group-1.north west) -- (n\number\CF_cnt_group-\number\CF_cnt_atomgroup.north east)
+ node [midway,yshift=1pt,overlay] {$\scriptscriptstyle\color{red}\number\CF_cnt_group$};
}
-\def\CF_keepmovearg @#1#2\_nil{\def\CF_currentatom{@{#1}}}
+\def\CF_savemovearg @#1#2\_nil{\def\CF_currentatom{@{#1}}}
\def\CF_drawatomgroupa#1{% transforme #1 en un groupe d'atomes
\CF_ifempty{#1}
- {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom
+ {%
+ \expandafter\let\csname atom_\number\CF_cnt_atomgroup\endcsname\CF_currentatom
}
- {\advance\CF_cntatomgroup1
+ {%
+ \advance\CF_cnt_atomgroup1
\futurelet\CF_toksa\CF_gobtonil#1\_nil
\CF_ifx @\CF_toksa
- {\CF_keepmovearg#1\_nil
+ {%
+ \CF_savemovearg#1\_nil
\CF_removemovearga#1\_nil\CF_aftermovearg
\CF_expsecond\CF_drawatomgroupb{\CF_aftermovearg}%
}%
- {\let\CF_currentatom\empty
+ {%
+ \let\CF_currentatom\empty
\CF_drawatomgroupb{#1}%
}%
}%
@@ -1486,18 +1730,24 @@
\def\CF_drawatomgroupb#1{%
\CF_ifempty{#1}
- {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom
+ {%
+ \expandafter\let\csname atom_\number\CF_cnt_atomgroup\endcsname\CF_currentatom
}
- {\futurelet\CF_toksa\CF_gobtonil#1\_nil
+ {%
+ \futurelet\CF_toksa\CF_gobtonil#1\_nil
\CF_ifx\bgroup\CF_toksa
- {\CF_eaddtomacro\CF_currentatom{\expandafter{\CF_firsttonil#1\_nil}}%
+ {%
+ \CF_eaddtomacro\CF_currentatom{\expandafter{\CF_firsttonil#1\_nil}}%
\CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}%
}%
- {\CF_ifx\CF_sptoken\CF_toksa
- {\CF_addtomacro\CF_currentatom{ }%
+ {%
+ \CF_ifx\CF_sptoken\CF_toksa
+ {%
+ \CF_addtomacro\CF_currentatom{ }%
\CF_expsecond\CF_drawatomgroupba{\CF_afterspace#1\_nil}%
}%
- {\CF_eaddtomacro\CF_currentatom{\CF_firsttonil#1\_nil}%
+ {%
+ \CF_eaddtomacro\CF_currentatom{\CF_firsttonil#1\_nil}%
\CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}%
}%
}%
@@ -1507,7 +1757,8 @@
% enlève tous les "@{nom}" de la sc #1
\def\CF_removemovearg#1{%
\CF_expsecond\CF_ifinstr{#1}@%
- {\expandafter\CF_removemovearga#1\_nil#1%
+ {%
+ \expandafter\CF_removemovearga#1\_nil#1%
\CF_removemovearg#1%
}%
{}%
@@ -1525,52 +1776,72 @@
\def\CF_drawatomgroupba#1{% transforme #1 en un groupe d'atomes
\CF_ifempty{#1}
- {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom
+ {%
+ \expandafter\let\csname atom_\number\CF_cnt_atomgroup\endcsname\CF_currentatom
\let\CF_currentatom\empty
}
- {\futurelet\CF_toksa\CF_gobtonil#1\_nil
+ {%
+ \futurelet\CF_toksa\CF_gobtonil#1\_nil
\CF_ifx @\CF_toksa
- {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom
+ {%
+ \expandafter\let\csname atom_\number\CF_cnt_atomgroup\endcsname\CF_currentatom
\let\CF_currentatom\empty
\CF_drawatomgroupa{#1}%
}%
- {\CF_ifx|\CF_toksa
- {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom
+ {%
+ \CF_ifx|\CF_toksa
+ {%
+ \expandafter\let\csname atom_\number\CF_cnt_atomgroup\endcsname\CF_currentatom
\let\CF_currentatom\empty
\CF_expsecond\CF_drawatomgroupa{\CF_gobarg#1}%
}%
- {\CF_ifx\CF_sptoken\CF_toksa
- {\CF_addtomacro\CF_currentatom{ }%
+ {%
+ \CF_ifx\CF_sptoken\CF_toksa
+ {%
+ \CF_addtomacro\CF_currentatom{ }%
\CF_expsecond\CF_drawatomgroupba{\CF_afterspace#1\_nil}%
}%
- {\CF_ifx\bgroup\CF_toksa
- {\CF_eaddtomacro\CF_currentatom{\expandafter{\CF_firsttonil#1\_nil}}%
+ {%
+ \CF_ifx\bgroup\CF_toksa
+ {%
+ \CF_eaddtomacro\CF_currentatom{\expandafter{\CF_firsttonil#1\_nil}}%
\CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}%
}%
- {\CF_expsecond\CF_ifcarisupperletter{\CF_firsttonil#1\_nil}%
- {\expandafter\let\csname atom_\number\CF_cntatomgroup\endcsname\CF_currentatom
+ {%
+ \CF_expsecond\CF_ifcarisupperletter{\CF_firsttonil#1\_nil}%
+ {%
+ \expandafter\let\csname atom_\number\CF_cnt_atomgroup\endcsname\CF_currentatom
\let\CF_currentatom\empty
\CF_drawatomgroupa{#1}%
}%
- {\CF_ifx?\CF_toksa
- {\CF_expsecond\CF_iffirsttokmatch{\CF_gobarg#1}[% un crochet après le "?"
- {\expandafter\CF_graboptarg\CF_gobarg#1\_nil\CF_afterhook}%
- {\CF_expafter{\CF_graboptarg[]}{\CF_gobarg#1}\_nil\CF_afterhook}%
+ {%
+ \CF_ifx?\CF_toksa
+ {%
+ \CF_expsecond\CF_iffirsttokmatch{\CF_gobarg#1}[% un crochet après le "?"
+ {%
+ \expandafter\CF_graboptarg\CF_gobarg#1\_nil\CF_afterhook
+ }%
+ {%
+ \CF_expafter{\CF_graboptarg[]}{\CF_gobarg#1}\_nil\CF_afterhook
+ }%
\CF_exptwomacroargs\CF_ifinstr{\CF_hooklist}{\expandafter(\CF_hookcurrentname)}% crochet déjà défini ?
- {\CF_expsecond\CF_hookparselist{\CF_hookcurrentname}% chercher les caractéristiques du crochet sauvegardé
+ {%
+ \CF_expsecond\CF_hookparselist{\CF_hookcurrentname}% chercher les caractéristiques du crochet sauvegardé
\CF_edefaddtomacro\CF_hookdrawlist{%
- [\CF_hookcurrentname,\CF_hookcurrentlink,\CF_hookcurrenttikz]{\CF_hooksavedcoord}{n\number\CF_cntgroup-\number\CF_cntatomgroup}}%
+ [\CF_hookcurrentname,\CF_hookcurrentlink,\CF_hookcurrenttikz]{\CF_hooksavedcoord}{n\number\CF_cnt_group-\number\CF_cnt_atomgroup}}%
\CF_eaddtomacro\CF_hookdrawlist{\expandafter{\CF_hooksavedcontent}}%
\CF_eaddtomacro\CF_hookdrawlist{\expandafter{\CF_currentatom}}% ajoute les 4 arguments à la liste des crochets à tracer
\global\let\CF_hookdrawlist\CF_hookdrawlist
}%
- {\CF_edefaddtomacro\CF_hooklist{(\CF_hookcurrentname)|n\number\CF_cntgroup-\number\CF_cntatomgroup|}%
+ {%
+ \CF_edefaddtomacro\CF_hooklist{(\CF_hookcurrentname)|n\number\CF_cnt_group-\number\CF_cnt_atomgroup|}%
\CF_eaddtomacro\CF_hooklist{\CF_currentatom|}%
\global\let\CF_hooklist\CF_hooklist
}%
\CF_expsecond\CF_drawatomgroupba{\CF_afterhook}%
}%
- {\CF_eaddtomacro\CF_currentatom{\CF_firsttonil#1\_nil}%
+ {%
+ \CF_eaddtomacro\CF_currentatom{\CF_firsttonil#1\_nil}%
\CF_expsecond\CF_drawatomgroupba{\CF_gobarg#1}%
}%
}%
@@ -1603,7 +1874,8 @@
\def\CF_removehook#1{%
\CF_expsecond\CF_ifinstr{#1}?%
- {\CF_expafter{\CF_removehooka\relax}#1\_nil#1%
+ {%
+ \CF_expafter{\CF_removehooka\relax}#1\_nil#1%
\CF_removehook#1%
}
{}%
@@ -1611,8 +1883,12 @@
\def\CF_removehooka#1?#2\_nil#3{%
\CF_iffirsttokmatch{#2}[%
- {\CF_removehookb#1?#2\_nil#3}
- {\CF_expsecond{\def#3}{\CF_gobarg#1#2}}%
+ {%
+ \CF_removehookb#1?#2\_nil#3%
+ }
+ {%
+ \CF_expsecond{\def#3}{\CF_gobarg#1#2}%
+ }%
}
\def\CF_removehookb#1?[#2]#3\_nil#4{\CF_expsecond{\def#4}{\CF_gobarg#1#3}}
@@ -1655,13 +1931,15 @@
\begingroup
\setKV[charge]{#1}%
\ifboolKV[charge]{lewisautorot}
- {\pgfmathsetmacro\CF_lewisrot{90+\chargeangle}}
- {\def\CF_lewisrot{0}}%
+ {%
+ \pgfmathsetmacro\CF_lewisrot{90+\chargeangle}%
+ }
+ {%
+ \def\CF_lewisrot{0}%
+ }%
\pgfmathsetmacro\CF_halfsep{\CF_dotsep/2}%
- \tikzpicture[anchor=center,rotate=\CF_lewisrot]%
- \CF_expafter{\draw[}{\CF_dotstyle}]%
- (-\CF_halfsep pt,0)circle(\CF_dotradius)%
- (\CF_halfsep pt,0)circle(\CF_dotradius);%
+ \tikzpicture[anchor=center,rotate=\CF_lewisrot]
+ \CF_expafter{\draw[}{\CF_dotstyle}](-\CF_halfsep pt,0)circle(\CF_dotradius)(\CF_halfsep pt,0)circle(\CF_dotradius);%
\endtikzpicture
\endgroup
}
@@ -1670,8 +1948,12 @@
\begingroup
\setKV[charge]{#1}%
\ifboolKV[charge]{lewisautorot}
- {\pgfmathsetmacro\CF_lewisrot{90+\chargeangle}}
- {\def\CF_lewisrot{0}}%
+ {%
+ \pgfmathsetmacro\CF_lewisrot{90+\chargeangle}%
+ }
+ {%
+ \def\CF_lewisrot{0}%
+ }%
\pgfmathsetmacro\CF_halfwidth{\CF_rectwidth/2}%
\pgfmathsetmacro\CF_halflength{\CF_rectlength/2}%
\tikzpicture[anchor=center,rotate=\CF_lewisrot]%
@@ -1684,8 +1966,12 @@
\begingroup
\setKV[charge]{#1}%
\ifboolKV[charge]{lewisautorot}
- {\pgfmathsetmacro\CF_lewisrot{90+\chargeangle}}
- {\def\CF_lewisrot{0}}%
+ {%
+ \pgfmathsetmacro\CF_lewisrot{90+\chargeangle}%
+ }
+ {%
+ \def\CF_lewisrot{0}%
+ }%
\pgfmathsetmacro\CF_halflength{\CF_rectlength/2}%
\tikzpicture[anchor=center,rotate=\CF_lewisrot]%
\CF_eexpafter{\draw[}{\useKV[charge]{|style}}](-\CF_halflength pt,0)--(\CF_halflength pt,0);% bugfix 1.51
@@ -1719,19 +2005,21 @@
\charge_a{false}%
}
\def\charge_a#1#2{% #1=TF #2=liste emplacements
- \CF_testopt{\charge_b{#1}}{}#2\_nil
+ \CF_testopt{\charge_b{#1}}{}#2\_nil
}
\def\charge_b#1[#2]#3\_nil{%
- \charge_c{#1}[#2]{#3}%
+ \charge_c{#1}[#2]{#3}%
}
\def\charge_c#1[#2]#3#4{% #1=TF pour overlay, #2= réglages, #3=liste d'emplacements, #4=atome
\setcharge{overlay=#1,#2}%
\setbox\CF_chargebox\hbox{\useKV[charge]{macro atom}{#4}}%
\CF_ifinsidetikz
- {\pgfinterruptpicture
+ {%
+ \pgfinterruptpicture
\let\CF_atendofcharge\endpgfinterruptpicture
}
- {\let\CF_atendofcharge\relax
+ {%
+ \let\CF_atendofcharge\relax
}%
\expanded{\noexpand
\tikzpicture[every node/.style={%
@@ -1762,7 +2050,9 @@
\vrule width\wd\CF_chargebox height\CF_zero depth\CF_zero};% noeud pour placer les charges
\let\enableshortcuts\relax
\let\disableshortcuts\relax
- \ifboolKV[charge]{shortcuts}\CF_enableshortcuts{}% l'atome n'est _PAS_ concerné par les racourcis
+ \ifboolKV[charge]{shortcuts}
+ \CF_enableshortcuts
+ {}% l'atome n'est _PAS_ concerné par les racourcis
\charge_d#3,\CF_quark=%
\endtikzpicture
\CF_atendofcharge
@@ -1771,23 +2061,35 @@
\def\charge_d#1={%
\CF_ifx\CF_quark{#1}%
{}
- {\CF_striplastsp{#1}\charge_e=}% bugfix 1.54
+ {%
+ \CF_striplastsp{#1}\charge_e=% bugfix 1.54
+ }%
}
\def\charge_e#1={%
\CF_ifinstr{#1}[
- {\charge_f#1=}
- {\charge_f#1[]=}%
+ {%
+ \charge_f#1=%
+ }
+ {%
+ \charge_f#1[]=%
+ }%
}
\def\charge_f#1[#2]={%
\CF_ifinstr{#1}:
- {\charge_g#1[#2]=}
- {\charge_g#1:0pt[#2]=}%
+ {%
+ \charge_g#1[#2]=%
+ }
+ {%
+ \charge_g#1:0pt[#2]=%
+ }%
}
\def\charge_g#1:#2[#3]=#4,{% #1=angle, #2=offset, #3=code tikz charge, #4=charge
\CF_stripsp{#1}\CF_ifinteger
- {\pgfmathsetmacro\chargeangle{mod(#1,360)}%
+ {%
+ \pgfmathsetmacro\chargeangle{mod(#1,360)}%
}
- {\pgfmathanglebetweenpoints{\pgfpointanchor{atom}{center}}{\CF_stripsp{#1}{\pgfpointanchor{atom}}}%
+ {%
+ \pgfmathanglebetweenpoints{\pgfpointanchor{atom}{center}}{\CF_stripsp{#1}{\pgfpointanchor{atom}}}%
\let\chargeangle\pgfmathresult% incorrect si (atom.center==atom.#1) && (extra sep==0) TODO: mettre un warning ?
}%
\edef\CF_offset{\the\dimexpr#2+0pt}%
@@ -1797,39 +2099,55 @@
\charge_d
}
-\def\Chembelow{\begingroup\let\CF_temp\CF_gobarg\CF_chembelowa}
+\def\Chembelow{%
+ \begingroup
+ \let\CF_temp\CF_gobarg
+ \CF_chembelowa
+}
-\def\chembelow{\begingroup\let\CF_temp\CF_id\CF_chembelowa}
+\def\chembelow{%
+ \begingroup
+ \let\CF_temp\CF_id
+ \CF_chembelowa
+}
\def\CF_chembelowa{\CF_testopt\CF_chembelowb\CF_stacksep}
\def\CF_chembelowb[#1]#2#3{%
- \setbox\CF_box\hbox{\printatom{#2}}%
- \expandafter\vtop\CF_temp{to\ht\CF_box}{%
- \offinterlineskip
- \hbox{\printatom{#2}}%
- \kern#1\relax
- \hbox to\wd\CF_box{\hss\printatom{#3}\hss}%
- \CF_temp\vss
- }%
+ \setbox\CF_box\hbox{\printatom{#2}}%
+ \expandafter\vtop\CF_temp{to\ht\CF_box}{%
+ \offinterlineskip
+ \hbox{\printatom{#2}}%
+ \kern#1\relax
+ \hbox to\wd\CF_box{\hss\printatom{#3}\hss}%
+ \CF_temp\vss
+ }%
\endgroup
}
-\def\Chemabove{\begingroup\let\CF_temp\CF_gobarg\CF_chemabovea}
+\def\Chemabove{%
+ \begingroup
+ \let\CF_temp\CF_gobarg
+ \CF_chemabovea
+}
-\def\chemabove{\begingroup\let\CF_temp\CF_id\CF_chemabovea}
+\def\chemabove{%
+ \begingroup
+ \let\CF_temp\CF_id
+ \CF_chemabovea
+}
\def\CF_chemabovea{\CF_testopt\CF_chemaboveb\CF_stacksep}
\def\CF_chemaboveb[#1]#2#3{%
- \setbox\CF_box\hbox{\printatom{#2}}%
- \expandafter\vbox\CF_temp{to\ht\CF_box}{%
- \offinterlineskip
- \CF_temp\vss
- \hbox to\wd\CF_box{\hss\printatom{#3}\hss}%
- \kern#1\relax
- \hbox{\printatom{#2}}%
- }%
+ \setbox\CF_box\hbox{\printatom{#2}}%
+ \expandafter\vbox\CF_temp{to\ht\CF_box}{%
+ \offinterlineskip
+ \CF_temp\vss
+ \hbox to\wd\CF_box{\hss\printatom{#3}\hss}%
+ \kern#1\relax
+ \hbox{\printatom{#2}}%
+ }%
\endgroup
}
@@ -1837,7 +2155,8 @@
\def\CF_chemmove[#1]#2{%
\CF_doifnotempty{#2}%
- {\expandafter\tikzpicture\expanded{[overlay,remember picture,-CF\CF_ifempty{#1}{}{,\unexpanded{#1}}]}%
+ {%
+ \expandafter\tikzpicture\expanded{[overlay,remember picture,-CF\CF_ifempty{#1}{}{,\unexpanded{#1}}]}%
#2%
\endtikzpicture
}%
@@ -1856,8 +2175,14 @@
\def\chemname{%
\CF_ifstar
- {\CF_adjustnamedpfalse\CF_chemnamea}
- {\CF_adjustnamedptrue \CF_chemnamea}%
+ {%
+ \CF_adjust_name_dpfalse
+ \CF_chemnamea
+ }
+ {%
+ \CF_adjust_name_dptrue
+ \CF_chemnamea
+ }%
}
\def\CF_chemnamea{\CF_testopt\CF_chemnameb{1.5ex}}
@@ -1872,7 +2197,7 @@
\vtop{%
\box\CF_boxstuff
\nointerlineskip
- \kern\dimexpr#1\ifCF_adjustnamedp+\CF_dpmax-\CF_dpstuffbox\fi\relax
+ \kern\dimexpr#1\ifCF_adjust_name_dp+\CF_dpmax-\CF_dpstuffbox\fi\relax
\CF_parsemolname#3\\\_nil
}%
}
@@ -1917,13 +2242,18 @@
}
\def\CF_setstyle#1,#2,#3\_nil#4#5#6{%
- \def#4{#1}\let#5\empty\let#6\empty
+ \def#4{#1}%
+ \let#5\empty
+ \let#6\empty
\CF_iffirsttokmatch\CF_quark{#2\relax}
{}%
- {\def#5{#2}%
+ {%
+ \def#5{#2}%
\CF_iffirsttokmatch\CF_quark{#3\relax}
{}%
- {\CF_setstylea#3\_nil#6}%
+ {%
+ \CF_setstylea#3\_nil#6%
+ }%
}%
}
\def\CF_setstylea#1,\CF_quark#2\_nil#3{\def#3{#1}}
@@ -1932,39 +2262,69 @@
\def\CF_anda{%
\CF_ifx\CF_toksa\bgroup
- {\CF_andb}
- {\CF_andb{}}%
+ {%
+ \CF_andb
+ }
+ {%
+ \CF_andb{}%
+ }%
}
\def\CF_andb#1{%
\CF_setstyle#1,\CF_quark,\CF_quark\_nil\CF_signspaceante_\CF_signspacepost_\CF_signvshift_
- \CF_doifnotempty\CF_signspaceante_{\let\CF_signspaceante\CF_signspaceante_}%
- \CF_doifnotempty\CF_signspacepost_{\let\CF_signspacepost\CF_signspacepost_}%
- \CF_doifnotempty\CF_signvshift_{\let\CF_signvshift\CF_signvshift_}%
+ \CF_doifnotempty\CF_signspaceante_
+ {%
+ \let\CF_signspaceante\CF_signspaceante_
+ }%
+ \CF_doifnotempty\CF_signspacepost_
+ {%
+ \let\CF_signspacepost\CF_signspacepost_
+ }%
+ \CF_doifnotempty\CF_signvshift_
+ {%
+ \let\CF_signvshift\CF_signvshift_
+ }%
\raise\CF_signvshift\hbox{\kern\CF_signspaceante$+$\kern\CF_signspacepost}%
}
\def\schemestart{%
\begingroup
- \ifnum\CF_schemenest=0 \expandafter\CF_id\else\expandafter\CF_gobarg\fi{\useKV[chemfig]{schemestart code}}%
+ \CF_ifnum{\CF_schemenest=0 }
+ {%
+ \useKV[chemfig]{schemestart code}%
+ }%
+ {}%
\xdef\CF_schemenest{\number\numexpr\CF_schemenest+1}%
\CF_testopt\CF_schemestarta{}%
}
\def\CF_schemestarta[#1]{%
\CF_setstyle#1,\CF_quark,\CF_quark\_nil\CF_arrowangle_\CF_arrowlength_\CF_arrowstyle_
- \CF_doifnotempty\CF_arrowangle_{\let\CF_arrowangle\CF_arrowangle_}%
- \CF_doifnotempty\CF_arrowlength_{\let\CF_arrowlength\CF_arrowlength_}%
+ \CF_doifnotempty\CF_arrowangle_
+ {%
+ \let\CF_arrowangle\CF_arrowangle_
+ }%
+ \CF_doifnotempty\CF_arrowlength_
+ {%
+ \let\CF_arrowlength\CF_arrowlength_%
+ }%
\CF_eexpsecond{\def\CF_arrowtip}{\expandafter\CF_gobarg\CF_arrowhead}%
\CF_expsecond{\CF_preaddtomacro\CF_defaultarrowstyle}{\CF_arrowhead,}%
\let\CF_arrowstyle\CF_defaultarrowstyle
- \CF_doifnotempty\CF_arrowstyle_{\CF_eaddtomacro\CF_arrowstyle{\expandafter,\CF_arrowstyle_}}%
+ \CF_doifnotempty\CF_arrowstyle_
+ {%
+ \CF_eaddtomacro\CF_arrowstyle{\expandafter,\CF_arrowstyle_}%
+ }%
\pgfmathsetmacro\CF_arrowdoublesep{\CF_arrowdoublesep/2}%
\pgfmathsetmacro\CF_arrowdoubleposstart{(1-\CF_arrowdoubleposstart)/2}%
\pgfmathsetmacro\CF_arrowdoubleposend{1-\CF_arrowdoubleposstart}%
\ifboolKV[chemfig]{scheme debug}
- {\tikzpicture[every node/.style={draw,anchor=base,inner sep=0pt,outer sep=0pt,minimum size=1.5pt},baseline,remember picture]}
- {\tikzpicture[every node/.style={anchor=base,inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline,remember picture]}%
+ {%
+ \tikzpicture[every node/.style={draw,anchor=base,inner sep=0pt,outer sep=0pt,minimum size=1.5pt},baseline,remember picture]%
+ }
+ {%
+ \tikzpicture[every node/.style={anchor=base,inner sep=0pt,outer sep=0pt,minimum size=0pt},baseline,remember picture]%
+ }%
\let\merge\CF_merge
\expandafter\let\csname+\endcsname\CF_and
\let\arrow\CF_arrow
@@ -1975,15 +2335,19 @@
\def\CF_schemestartb[#1]{%
\ifnum\CF_schemenest=1 % la commande n'est pas imbriquée ?
- \CF_cntcompound0
+ \CF_cnt_compound0
\fi
- \edef\CF_currentnodename{c\number\CF_cntcompound}%
+ \edef\CF_currentnodename{c\number\CF_cnt_compound}%
\let\CF_nextnodename\empty
\let\CF_nextnodestyle\empty
\let\CF_directarrowlist\empty
\ifboolKV[chemfig]{scheme debug}
- {\node[fill,green](\CF_currentnodename){};}
- {\node(\CF_currentnodename){};}%
+ {%
+ \node[fill,green](\CF_currentnodename){};%
+ }
+ {%
+ \node(\CF_currentnodename){};%
+ }%
\def\CF_nextnodeanchor{#1}%
\CF_doifempty\CF_nextnodeanchor{\def\CF_nextnodeanchor{text}}%
\let\CF_compound\empty
@@ -1999,18 +2363,23 @@
\def\CF_schemestarte{% ... et l'examine :
\CF_iffirsttokina{\arrow\schemestop\merge}%
{}
- {\CF_ifx\CF_toksa\bgroup
- {\ifCF_compound_is_chemfig% bugfix 1.6
+ {%
+ \CF_ifx\CF_toksa\bgroup
+ {%
+ \ifCF_compound_is_chemfig% bugfix 1.6
\edef\CF_restore_hashcatcode{\catcode\number`\#=\number\catcode`\# \relax}%
\catcode`\#12 % TODO ou carrément mettre # à 12 dans tout l'environnement ?
\fi
\CF_addnextarg
}
- {\CF_ifx\CF_toksa\CF_sptoken
- {\CF_addtomacro\CF_compound{ }%
+ {%
+ \CF_ifx\CF_toksa\CF_sptoken
+ {%
+ \CF_addtomacro\CF_compound{ }%
\CF_schemestartd
}
- {\CF_ifx\CF_toksa\chemfig
+ {%
+ \CF_ifx\CF_toksa\chemfig
\CF_compound_is_chemfigtrue% mettre le flag à vrai
{}%
\afterassignment\CF_schemestartc
@@ -2031,35 +2400,52 @@
\def\CF_displaycompound#1#2{% #1 = nom et #2 = style
\CF_doifnotempty\CF_compound
- {\global\advance\CF_cntcompound1
+ {%
+ \global\advance\CF_cnt_compound1
\CF_ifx\CF_defaultcompoundstyle\empty
- {\let\CF_currentnodestyle\empty}
- {\CF_expsecond{\def\CF_currentnodestyle}{\CF_defaultcompoundstyle,}}%
+ {%
+ \let\CF_currentnodestyle\empty
+ }
+ {%
+ \CF_expsecond{\def\CF_currentnodestyle}{\CF_defaultcompoundstyle,}%
+ }%
\CF_addtomacro\CF_currentnodestyle{anchor=\CF_nextnodeanchor,at=(\CF_currentnodename)}%
\CF_ifempty{#2}%
- {\CF_doifnotempty\CF_nextnodestyle
- {\CF_eaddtomacro\CF_currentnodestyle{\expandafter,\CF_nextnodestyle}}%
+ {%
+ \CF_doifnotempty\CF_nextnodestyle
+ {%
+ \CF_eaddtomacro\CF_currentnodestyle{\expandafter,\CF_nextnodestyle}%
+ }%
}
{\CF_doifnotempty\CF_nextnodestyle
- {\CF_warning{two styles for the same node, first style "\CF_nextnodestyle" ignored}%
+ {%
+ \CF_warning{two styles for the same node, first style "\CF_nextnodestyle" ignored}%
}%
\CF_addtomacro\CF_currentnodestyle{,#2}%
}%
\CF_ifempty{#1}
- {\edef\CF_temp{%
+ {%
+ \edef\CF_temp{%
\CF_ifempty\CF_nextnodename
- {c\number\CF_cntcompound}
- {\CF_nextnodename}%
+ {%
+ c\number\CF_cnt_compound
+ }
+ {%
+ \CF_nextnodename
+ }%
}%
}
- {\CF_doifnotempty\CF_nextnodename
- {\CF_warning{two names for the same node, first name "\CF_nextnodename" ignored}%
+ {%
+ \CF_doifnotempty\CF_nextnodename
+ {%
+ \CF_warning{two names for the same node, first name "\CF_nextnodename" ignored}%
}%
\edef\CF_temp{#1}%
}%
\CF_expafter{\node[}\CF_currentnodestyle](\CF_temp){\CF_compound};%
\ifboolKV[chemfig]{scheme debug}%
- {\node[draw=none,anchor=270,at=(\CF_temp.90),fill=green!60,overlay,opacity=0.5]{\scriptsize\bfseries\CF_temp};%
+ {%
+ \node[draw=none,anchor=270,at=(\CF_temp.90),fill=green!60,overlay,opacity=0.5]{\scriptsize\bfseries\CF_temp};%
}
{}%
\let\CF_currentnodename\CF_temp
@@ -2071,7 +2457,11 @@
\CF_directarrowlist
\endtikzpicture
\xdef\CF_schemenest{\number\numexpr\CF_schemenest-1}%
- \ifnum\CF_schemenest=0 \expandafter\CF_id\else\expandafter\CF_gobarg\fi{\useKV[chemfig]{schemestop code}}%
+ \CF_ifnum{\CF_schemenest=0 }
+ {%
+ \useKV[chemfig]{schemestop code}%
+ }%
+ {}%
\endgroup
}
@@ -2079,17 +2469,27 @@
\def\CF_analysearrowarga#1[#2]#3\_nil{%
\CF_ifinstr{#1}.
- {\CF_addtomacro\CF_temp{#1[#2]}}
- {\CF_addtomacro\CF_temp{#1.[#2]}}%
+ {%
+ \CF_addtomacro\CF_temp{#1[#2]}%
+ }
+ {%
+ \CF_addtomacro\CF_temp{#1.[#2]}%
+ }%
}
\def\CF_arrow{%
\CF_ifnextchar(%
- {\CF_arrowa
+ {%
+ \CF_arrowa
}
- {\CF_ifnextchar\bgroup
- {\CF_arrowb(.[]--.[])}
- {\CF_arrowb(.[]--.[]){}}%
+ {%
+ \CF_ifnextchar\bgroup
+ {%
+ \CF_arrowb(.[]--.[])%
+ }
+ {%
+ \CF_arrowb(.[]--.[]){}%
+ }%
}%
}
@@ -2100,13 +2500,20 @@
\CF_analysearrowarg{#2}%
\CF_addtomacro\CF_temp)%
\CF_ifnextchar\bgroup
- {\expandafter\CF_arrowb\CF_temp}
- {\expandafter\CF_arrowb\CF_temp{}}%
+ {%
+ \expandafter\CF_arrowb\CF_temp
+ }
+ {%
+ \expandafter\CF_arrowb\CF_temp{}%
+ }%
}
\def\CF_arrowb(#1.#2[#3]--#4.#5[#6])#7{%
\def\CF_currentarrowtype{#7}% nom de la flèche
- \CF_doifempty\CF_currentarrowtype{\def\CF_currentarrowtype{->}}%
+ \CF_doifempty\CF_currentarrowtype
+ {%
+ \def\CF_currentarrowtype{->}%
+ }%
\CF_testopt{\CF_arrowc(#1.#2[#3]--#4.#5[#6])}{}%
}
@@ -2131,8 +2538,14 @@
\CF_eaddtomacro\CF_directarrowlist{\expandafter\CF_directarrow\expandafter{\CF_currentarrowtype}{#1}{#2}{#4}{#5}{#9}}%
\let\CF_nextaction\CF_schemestartc
\else
- \CF_doifnotempty\CF_arrowcurrentstyle{\CF_addtomacro\CF_arrowcurrentstyle,}%
- \CF_doifnotempty{#9}{\CF_addtomacro\CF_arrowcurrentstyle{#9,}}%
+ \CF_doifnotempty\CF_arrowcurrentstyle
+ {%
+ \CF_addtomacro\CF_arrowcurrentstyle,%
+ }%
+ \CF_doifnotempty{#9}
+ {%
+ \CF_addtomacro\CF_arrowcurrentstyle{#9,}%
+ }%
\CF_displaycompound{}{#3}%
\def\CF_nextnodename{#4}%
\CF_expsecond{\def\CF_currentnodename}{\CF_gobarg#1}%
@@ -2142,8 +2555,14 @@
\def\CF_nextnodestyle{#6}%
\fi
\else
- \CF_doifnotempty\CF_arrowcurrentstyle{\CF_addtomacro\CF_arrowcurrentstyle,}%
- \CF_doifnotempty{#9}{\CF_addtomacro\CF_arrowcurrentstyle{#9,}}%
+ \CF_doifnotempty\CF_arrowcurrentstyle
+ {%
+ \CF_addtomacro\CF_arrowcurrentstyle,%
+ }%
+ \CF_doifnotempty{#9}
+ {%
+ \CF_addtomacro\CF_arrowcurrentstyle{#9,}%
+ }%
\if @\expandafter\CF_firsttonil\detokenize{#2.}\_nil
\CF_error{syntax "(<name>--@<name>)" is not allowed}%
\else
@@ -2179,10 +2598,12 @@
\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep),cyan,fill](end@arrow@i@\number\CF_schemenest){};%
\edef\CF_arrowendname{end@arrow@i@\number\CF_schemenest\CF_doifnotempty{#4}{.#4}}%
\ifboolKV[chemfig]{scheme debug}
- {\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset),red,fill](start@arrow){};%
+ {%
+ \node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset),red,fill](start@arrow){};%
\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep-\CF_arrowoffset),red,fill](end@arrow){};%
}
- {\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset)](start@arrow){};%
+ {%
+ \node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_arrowoffset)](start@arrow){};%
\node[at=(\CF_currentnodename.\CF_ifempty{#3}\CF_arrowcurrentangle{#3}),shift=(\CF_arrowcurrentangle:\CF_currentarrowlength*\CF_compoundsep-\CF_arrowoffset)](end@arrow){};%
}%
\def\CF_arrowstartnode{start@arrow}\def\CF_arrowendnode{end@arrow}%
@@ -2195,8 +2616,8 @@
% trace un flèche initiée par (@nom--@nom)
% #1=type de flèche #2=nom depart #3=ancre départ #4=nom arrivée #5=ancre arrivée #6=style flèche
\def\CF_directarrow#1#2#3#4#5#6{%
- \CF_expsecond{\def\CF_arrowstartname}{\CF_gobarg#2}%
- \CF_expsecond{\def\CF_arrowendname}{\CF_gobarg#4}%
+ \edef\CF_arrowstartname{\CF_gobarg#2\ifx\empty#3\empty\else.#3\fi}% BUGFIX 1.6d
+ \edef\CF_arrowendname{\CF_gobarg#4\ifx\empty#5\empty\else.#5\fi}% BUGFIX 1.6d
\path[sloped,allow upside down](\CF_gobarg#2\ifx\empty#3\empty\else.#3\fi)--(\CF_gobarg#4\ifx\empty#5\empty\else.#5\fi)%
coordinate[pos=0,xshift=\CF_arrowoffset](start@direct@arrow)%
coordinate[pos=1,xshift=-\CF_arrowoffset](end@direct@arrow);%
@@ -2264,10 +2685,12 @@
\if\relax\expandafter\noexpand\CF_firsttonil#1\_nil
\else
\CF_ifdot{#1}%
- {\edef\merge_currentnodename{\CF_beforedot#1\_nil}%
+ {%
+ \edef\merge_currentnodename{\CF_beforedot#1\_nil}%
\edef\merge_currentanchor{\CF_afterdot#1\_nil}%
}%
- {\def\merge_currentnodename{#1}%
+ {%
+ \def\merge_currentnodename{#1}%
\let\merge_currentanchor\CF_mergeangle
}%
\if x\expandafter\CF_firsttonil\CF_mergeextreme\_nil
@@ -2285,8 +2708,12 @@
\def\CF_nextnodename{#1}%
\edef\CF_nextnodeanchor{%
\CF_ifempty{#2}
- {180+\CF_mergeangle}
- {#2}%
+ {%
+ 180+\CF_mergeangle
+ }
+ {%
+ #2%
+ }%
}%
\def\CF_nextnodestyle{#3}%
\let\CF_compound\empty
@@ -2295,24 +2722,40 @@
\def\CF_parsemergeopt#1,#2,#3,#4\_nil{%
\CF_ifempty{#1}
- {\def\CF_mergefromcoeff{0.5}}
- {\def\CF_mergefromcoeff{#1}}%
+ {%
+ \def\CF_mergefromcoeff{0.5}%
+ }
+ {%
+ \def\CF_mergefromcoeff{#1}%
+ }%
\def\CF_mergetocoeff{0.5}%
\def\CF_mergesplitcoeff{0.5}%
\CF_expsecond{\def\CF_mergestyle}{\CF_arrowhead}%
\CF_iffirsttokmatch\CF_quark{#2\relax}
{}
- {\CF_ifempty{#2}
- {\def\CF_mergetocoeff{0.5}}
- {\def\CF_mergetocoeff{#2}}%
+ {%
+ \CF_ifempty{#2}
+ {%
+ \def\CF_mergetocoeff{0.5}%
+ }
+ {%
+ \def\CF_mergetocoeff{#2}%
+ }%
\CF_iffirsttokmatch\CF_quark{#3\relax}
{}
- {\CF_ifempty{#3}
- {\def\CF_mergesplitcoeff{0.5}}
- {\def\CF_mergesplitcoeff{#3}}%
+ {%
+ \CF_ifempty{#3}
+ {%
+ \def\CF_mergesplitcoeff{0.5}%
+ }
+ {%
+ \def\CF_mergesplitcoeff{#3}%
+ }%
\CF_iffirsttokmatch\CF_quark{#4\relax}
{}
- {\CF_parsemergeopta#4\_nil}%
+ {%
+ \CF_parsemergeopta#4\_nil
+ }%
}%
}%
}
@@ -2320,15 +2763,23 @@
\def\CF_parsemergeopta#1,\CF_quark#2\_nil{%
\CF_ifempty{#1}
{}
- {\CF_addtomacro\CF_mergestyle{,#1}}%
+ {%
+ \CF_addtomacro\CF_mergestyle{,#1}%
+ }%
}
\def\CF_mergeparsenodelist(#1){%
\if\relax\expandafter\noexpand\CF_firsttonil#1\_nil
\else
\CF_ifdot{#1}%
- {\edef\merge_currentnodename{\CF_beforedot#1\_nil}\edef\merge_currentanchor{\CF_afterdot#1\_nil}}%
- {\def\merge_currentnodename{#1}\let\merge_currentanchor\CF_mergeangle}%
+ {%
+ \edef\merge_currentnodename{\CF_beforedot#1\_nil}%
+ \edef\merge_currentanchor{\CF_afterdot#1\_nil}%
+ }%
+ {%
+ \def\merge_currentnodename{#1}%
+ \let\merge_currentanchor\CF_mergeangle
+ }%
\pgfextractx\CF_dim{\pgfpointanchor\merge_currentnodename\merge_currentanchor}%
\ifdim\CF_dim>\CF_mergexmax
\edef\CF_mergexmax{\the\CF_dim}%
@@ -2352,12 +2803,12 @@
\def\CF_makeparametertext#1{%
\toks0{}%
- \CF_cntgroup#1\relax
+ \CF_cnt_group#1\relax
\CF_makeparametertexta1%
}
\def\CF_makeparametertexta#1{%
- \unless\ifnum#1>\CF_cntgroup
+ \unless\ifnum#1>\CF_cnt_group
\toks0\expandafter{\the\toks0[###1]}%
\expandafter\CF_makeparametertexta\expandafter{\number\numexpr#1+1\expandafter}%
\fi
@@ -2378,13 +2829,21 @@
\def\CF_rotatenode*#1#2\_nil{%
\CF_ifdot{#1}
- {\CF_beforedot#1\_nil}
- {#1}%
+ {%
+ \CF_beforedot#1\_nil
+ }
+ {%
+ #1%
+ }%
}
\def\CF_anchornode*#1#2\_nil#3{%
\CF_ifdot{#1}
- {\CF_afterdot#1\_nil}
- {\CF_arrowcurrentangle-#390-#1}%
+ {%
+ \CF_afterdot#1\_nil
+ }
+ {%
+ \CF_arrowcurrentangle-#390-#1%
+ }%
}
% #1 = label #2 = position #3 = + ou - (au dessus ou au dessous) #4 : nom du noeud de départ
@@ -2396,21 +2855,26 @@
\def\CF_arrowdisplaylabela#1#2#3{%
\CF_doifnotempty{#1}
- {\if*\expandafter\CF_firsttonil\detokenize{#1}\_nil
+ {%
+ \if*\expandafter\CF_firsttonil\detokenize{#1}\_nil
\ifboolKV[chemfig]{scheme debug}
- {node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted@node){}%
+ {%
+ node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted@node){}%
node[draw,rotate=\CF_rotatenode#1\_nil,anchor=\CF_anchornode#1\_nil#3,at=(shifted@node)]{\expandafter\CF_gobarg\CF_gobarg#1}%
}
- {node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep](shifted@node){}%
+ {%
+ node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep](shifted@node){}%
node[rotate=\CF_rotatenode#1\_nil,anchor=\CF_anchornode#1\_nil#3,at=(shifted@node)]{\expandafter\CF_gobarg\CF_gobarg#1}%
}%
\else
\ifboolKV[chemfig]{scheme debug}
- {node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted@node){}%
+ {%
+ node[pos=#2,sloped,yshift=#3\CF_arrowlabelsep,draw,fill,cyan](shifted@node){}%
node[draw,pos=#2,anchor=-#390,sloped,yshift=#3\CF_arrowlabelsep]{#1}%
}
- {node[pos=#2,anchor=-#390,sloped,yshift=#3\CF_arrowlabelsep]{#1}%
- }
+ {%
+ node[pos=#2,anchor=-#390,sloped,yshift=#3\CF_arrowlabelsep]{#1}%
+ }%
\fi
}%
}
@@ -2466,7 +2930,7 @@
node[pos=1,sloped,yshift=-\CF_arrowdoublesep](\CF_arrowstartnode @d1){};%
\begingroup
\ifboolKV[chemfig]{arrow double harpoon}
- {\pgfarrowharpoontrue}
+ \pgfarrowharpoontrue
{}%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @u0)--(\CF_arrowstartnode @u1);%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @d1)--(\CF_arrowstartnode @d0);%
@@ -2483,7 +2947,7 @@
node[pos=\CF_arrowdoubleposend,sloped,yshift=-1pt](\CF_arrowstartnode @d1){};%
\begingroup
\ifboolKV[chemfig]{arrow double harpoon}
- {\pgfarrowharpoontrue}
+ \pgfarrowharpoontrue
{}%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @u0)--(\CF_arrowstartnode @u1);%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @d1)--(\CF_arrowstartnode @d0);%
@@ -2499,7 +2963,7 @@
node[pos=1,sloped,yshift=-1pt](\CF_arrowstartnode @d1){};%
\begingroup
\ifboolKV[chemfig]{arrow double harpoon}
- {\pgfarrowharpoontrue}
+ \pgfarrowharpoontrue
{}%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @u0)--(\CF_arrowstartnode @u1);%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode @d1)--(\CF_arrowstartnode @d0);%
@@ -2516,11 +2980,19 @@
\CF_arrowshiftnodes{#3}%
\CF_expafter{\draw[}\CF_arrowcurrentstyle](\CF_arrowstartnode)--(\CF_arrowendnode)node[midway](Uarrow@arctangent){};%
\CF_ifempty{#4}
- {\def\CF_Uarrowradius{0.333}}
- {\def\CF_Uarrowradius{#4}}%
+ {%
+ \def\CF_Uarrowradius{0.333}%
+ }
+ {%
+ \def\CF_Uarrowradius{#4}%
+ }%
\CF_ifempty{#5}%
- {\def\CF_Uarrowabsangle{60}}
- {\pgfmathsetmacro\CF_Uarrowabsangle{abs(#5)}}% ne prendre en compte que la valeur absolue de l'angle
+ {%
+ \def\CF_Uarrowabsangle{60}%
+ }
+ {%
+ \pgfmathsetmacro\CF_Uarrowabsangle{abs(#5)}% ne prendre en compte que la valeur absolue de l'angle
+ }%
\expandafter\draw\expanded{[\CF_ifempty{#1}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}},-]}(Uarrow@arctangent)%
arc[radius=\CF_compoundsep*\CF_currentarrowlength*\CF_Uarrowradius,start angle=\CF_arrowcurrentangle-90,delta angle=-\CF_Uarrowabsangle]node(Uarrow@start){};
\expandafter\draw\expanded{[\CF_ifempty{#2}{draw=none}{\unexpanded\expandafter{\CF_arrowcurrentstyle}}]}(Uarrow@arctangent)%
@@ -2555,7 +3027,10 @@
\def\polymerdelim{\CF_ifnextchar[{\CF_polymerdelima}{\CF_polymerdelima[]}}
\def\CF_polymerdelima[#1]#2#3{%
\restoreKV[CFdelimiters]%
- \CF_doifnotempty{#1}{\setKV[CFdelimiters]{#1}}%
+ \CF_doifnotempty{#1}
+ {%
+ \setKV[CFdelimiters]{#1}%
+ }%
\edef\CF_delimhalfdim{\the\dimexpr(\CF_delimheight+\CF_delimdepth)/2}%
\edef\CF_delimvshift {\the\dimexpr(\CF_delimheight-\CF_delimdepth)/2}%
\chemmove{%
@@ -2566,16 +3041,21 @@
\pgfextracty\CF_dim{\pgfpointanchor{#3}{center}}\edef\CF_rightdelimy{\the\CF_dim}%
\def\CF_autorotate{0}%
\ifboolKV[CFdelimiters]{h align}
- {\let\CF_rightdelimy\CF_leftdelimy
+ {%
+ \let\CF_rightdelimy\CF_leftdelimy
}
{%
\ifboolKV[CFdelimiters]{auto rotate}
- {\pgfmathatantwo{\CF_rightdelimy-\CF_leftdelimy}{\CF_rightdelimx-\CF_leftdelimx}%
+ {%
+ \pgfmathatantwo{\CF_rightdelimy-\CF_leftdelimy}{\CF_rightdelimx-\CF_leftdelimx}%
\let\CF_autorotate\pgfmathresult
}
- {\CF_eexpsecond\CF_ifempty{\useKV[CFdelimiters]{rotate}}
+ {%
+ \CF_eexpsecond\CF_ifempty{\useKV[CFdelimiters]{rotate}}
{}
- {\edef\CF_autorotate{\useKV[CFdelimiters]{rotate}}}%
+ {%
+ \edef\CF_autorotate{\useKV[CFdelimiters]{rotate}}%
+ }%
}%
}%
\node[at={(\CF_leftdelimx+\CF_leftdelimxshift,\CF_leftdelimy+\CF_delimvshift)},rotate=\CF_autorotate]
@@ -2860,7 +3340,7 @@ v1.0h 2013/11/28
flèche n'était pas calculé
----------------------------------------------------------------------
v1.1 2015/02/13
- - correction d'un bug dans \CF_seeksubmol : la macro
+ - correction d'un bug dans \CF_searchsubmol : la macro
\CF_molecule est dépouillé de son éventuel espace
en première position.
- correction d'un bug dans \CF_arrowf : le nom du prochain
@@ -2908,7 +3388,7 @@ v1.2a 2015/10/21
code
----------------------------------------------------------------------
v1.2b 2015/11/15
- - bug dans \CF_seeksubmol qui laissait "*" dans le flux de
+ - bug dans \CF_searchsubmol qui laissait "*" dans le flux de
lecture de TeX. Un message d'erreur est également ajouté
en cas de "!" en fin de traitement.
- correction d'un bug dans \CF_setbondangle où l'angle [<:a>]
@@ -3011,14 +3491,14 @@ v1.5 2020/03/05
9 mois), soit fin 2020
- prise en compte de la dimension d'un groupe d'atome pour tracer
des liaisons jointives
- - bug corrigé dans \CF_seeknode
+ - bug corrigé dans \CF_searchnode
- ajout d'une section dans le manuel (placement des atomes)
----------------------------------------------------------------------
v1.51 2020/04/06
- bug corrigé dans \chargerect_a et \chargeline_a
----------------------------------------------------------------------
v1.52 2020/04/14
- - bug : définition corrigée de \CFthesubmol dans \def_submolc pour
+ - bug : définition corrigée de \CFthesubmol dans \CF_defsubmolc pour
qu'elle se développe en 1 coup seulement
----------------------------------------------------------------------
v1.53 2020/04/27
@@ -3057,4 +3537,12 @@ v1.6b 2021/08/01
----------------------------------------------------------------------
v1.6c 2022/09/27
- nouvelles clés "gchemname", "schemestart code" et
- "schemestop code" (suggestion de Balazs Debreceni) \ No newline at end of file
+ "schemestop code" (suggestion de Balazs Debreceni)
+----------------------------------------------------------------------
+v1.6d 2023/02/18
+ - les ancres 'b' et 'd' n'étaient pas prises en compte pour le
+ tracé de flèches directes de type (@a.b-@c.d) dans les schémas
+ réactionnels
+ - correction d'un bug : \CF_currentfromatom n'était pas
+ initialisé au début d'un cycle et donc le code suivant plantait
+ \chemfig{AB-[,,2]*3(---)} \ No newline at end of file
diff --git a/macros/generic/soul/README.md b/macros/generic/soul/README.md
new file mode 100644
index 0000000000..02e0a073d2
--- /dev/null
+++ b/macros/generic/soul/README.md
@@ -0,0 +1,27 @@
+# soul
+
+soul package for latex and plain
+
+Version: 2023-02-18 v3.0
+
+Provides hyphenable spacing out (letterspacing), underlining, striking out, etc., using the TEX hyphenation algorithm to find the proper hyphens automatically. The package also provides a mechanism that can be used to implement similar tasks, that have to treat text syllable by syllable. This is shown in two examples.
+
+This version is a merge of the original soul package from Melchior Franz and the soulutf8 package from Heiko Oberdiek
+and support also UTF8.
+
+
+## Copyright (C)
+
+* 1998--2003 Melchior FRANZ
+* 2007 Heiko Oberdiek
+* 2016-2023 Oberdiek Package Support Group
+
+
+## Issues
+https://github.com/ho-tex/soul/issues
+
+
+## License
+LATEX Project Public License, version 1.3c or later.
+
+
diff --git a/macros/generic/soul/soul-ori.dtx b/macros/generic/soul/soul-ori.dtx
new file mode 100644
index 0000000000..861c0843bf
--- /dev/null
+++ b/macros/generic/soul/soul-ori.dtx
@@ -0,0 +1,4469 @@
+% \iffalse
+%% File: soul-ori.dtx
+% Copyright (C) 1998--2003 Melchior FRANZ
+% Copyright (C) 2021-2023 Oberdiek Package Support Group
+% https://github.com/ho-tex/soul/issues
+%
+% COPYRIGHT NOTICE:
+% This package is free software that can be redistributed and/or modified
+% under the terms of the LaTeX Project Public License as specified
+% in the file macros/latex/base/lppl.txt on any CTAN archive server,
+% such as ftp://ftp.dante.de/.
+%
+%% Original author data:
+%% ====================================================================
+%% @LaTeX-package-file{
+%% author = "Melchior FRANZ",
+%% version = "2.4",
+%% date = "17 November 2003",
+%% filename = "soul.dtx",
+%% address = "Melchior FRANZ
+%% Rieder Hauptstrasse 52
+%% A-5212 SCHNEEGATTERN
+%% AUSTRIA",
+%% telephone = "++43 7746 3109",
+%% URL = "http://www.unet.univie.ac.at/~a8603365/",
+%% email = "a8603365@unet.univie.ac.at",
+%% codetable = "ISO/ASCII",
+%% keywords = "spacing out, letterspacing, underlining, striking out,
+%% highlighting",
+%% supported = "yes",
+%% docstring = "This article describes the `soul' package, which
+%% provides hyphenatable letterspacing (spacing out),
+%% underlining, and some derivatives.
+%% All features are based upon a common mechanism
+%% that allows to typeset text syllable by syllable,
+%% where the excellent TeX hyphenation algorithm is
+%% used to find the proper hyphenation points.
+%% Two examples show how to use the provided interface to
+%% implement things such as `an-a-lyz-ing syl-la-bles'.
+%% Although the package is optimized for LaTeX2e,
+%% it works with Plain TeX and with other
+%% packages, too.",
+%% }
+%% ====================================================================
+%
+%
+%
+%
+%
+%<*driver>
+\def\fileversion{3.0}
+\def\filedate{2023-18-02}
+%
+\documentclass{ltxdoc}
+%
+%
+%
+\makeatletter\let\SOUL@sethyphenchar\relax\makeatother
+\IfFileExists{soul.sty}{%
+ \usepackage{soul}[2002/01/10]
+ \expandafter\ifx\csname sloppyword\endcsname\relax % old version?
+ \def\sloppyword{\textbf{?? [obsolete soul version]}}
+ \fi
+ \let\SOULSTYfound\active
+}{%
+ \GenericWarning{soul.dtx}{%
+ Package file `soul.sty' couldn't be found. You should however find^^J^^A
+ a file `soul.ins' in the current directory. If you type "tex soul.ins"^^J^^A
+ on the command line, `soul.sty' will be generated. After that
+ run "latex soul.dtx" again and you won't see this message again.
+ }%
+}%
+%
+%
+%
+\usepackage{hyperref}
+ \hypersetup{
+ bookmarksopen,
+ colorlinks,
+ pdftitle={The soul-ori package},
+ pdfauthor={Melchior FRANZ},
+ pdfsubject={Version 3.0},
+ pdfkeywords={space out, letterspacing, underlining, overstriking, highlighting}
+ }
+ \usepackage{graphicx,color}
+ \pdfstringdefDisableCommands{%
+ \let\so\relax
+ \let\caps\relax
+ \let\ul\relax
+ \let\st\relax
+ \let\hl\relax
+ \def\soul{soul}%
+ \def\TeX{TeX}}
+%
+%
+%
+%\RecordChanges
+%
+\begin{document}
+\setcounter{tocdepth}{2}
+\DocInput{soul-ori.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \title{The \texttt{soul-ori} package}
+%
+% \author{Melchior \caps{FRANZ}}
+%
+% \date{November 17, 2003}
+%
+%^^A=====================================================
+%
+%^^A These messy macros allow to typeset the `example' sections
+%^^A conveniently. You'd better ignore them. I do! :-)
+%
+% \makeatletter
+%
+% \def\squarebull{\rule[.2ex]{.8ex}{.8ex}}
+%
+% \newenvironment{examples}
+% {\parindent\z@\small\fontencoding{OT1}\selectfont}
+% {\rule{\hsize}{.4pt}}
+%
+% \def\soultest#1|{\bgroup\rule[.5ex]{\hsize}{.4pt}\par
+% \parbox[t]{.34\hsize}{\raggedright\textit{#1\unskip.}}%
+% \hspace{1.5em}$\vtop\bgroup\hb@xt@.4\hsize\bgroup
+% \llap{\squarebull\hspace{.4em}}\soulttest}
+%
+% {\catcode`\|=13\gdef\soulttest{%
+% \bgroup\def\do##1{\catcode`##1=12}\dospecials\ttfamily
+% \catcode`\|=13\unskip\def|{\hss\egroup\egroup\soultttest}}}
+%
+% \def\soultttest#1{\hbox{\vtop{\hsize.4\hsize\hbadness\@M
+% \leavevmode\llap{\squarebull\hspace{.4em}}#1\null}}%
+% \egroup$\hspace{1.5em}\parbox[t]{1mm}{\hyphenpenalty-\@M
+% \exhyphenpenalty-\@M\hbadness\@M\hfuzz\maxdimen
+% \strut\llap{\squarebull\hspace{.4em}}#1\null}%
+% \goodbreak\vspace{2ex}
+% \egroup}
+%
+% \newcommand*\DescribeOption[1]{\marginpar{\raggedleft\textsf{#1}\ignorespaces}}
+%
+%
+%^^A similar to the `description' environment
+%
+% \def\describemacro{^^A
+% \bgroup
+% \let\do\@makeother
+% \dospecials
+% \catcode`{=1
+% \catcode`}=2
+% \SOUL@@@descmacro
+% }
+%
+% \def\SOUL@@@descmacro#1{^^A
+% \texttt{#1}^^A
+% \DescribeMacro{#1}^^A
+% \expandafter\edef\expandafter\x\expandafter{\expandafter\@gobble#1}^^A
+% \expandafter\label{cmd:\x}^^A
+% \egroup
+% }
+%
+%
+% \def\SOUL@@@verbitem[#1: {^^A
+% \bgroup
+% \let\do\@makeother
+% \dospecials
+% \SOUL@@@verbscan{#1}^^A
+% }
+%
+% \def\SOUL@@@verbscan#1#2]{^^A
+% \egroup
+% \goodbreak
+% \def\@currentlabel{\S\,\the\SOUL@@@itemnr}^^A
+% \label{par:#1}^^A
+% \SOUL@@@item[\textbf{\@currentlabel\hskip.6em#1:}]\hfil\break
+% Example: \texttt{#2}\hfil\break^^A
+% \advance\SOUL@@@itemnr1
+% }
+%
+% \let\SOUL@@@item\item
+% \newcount\SOUL@@@itemnr
+%
+% \newenvironment{verblist}[1]{^^A
+% \SOUL@@@itemnr=#1
+% \list{}{^^A
+% \settowidth{\labelwidth}{\indent\indent}^^A
+% \leftmargin\labelwidth
+% \advance\leftmargin\labelsep
+% \def\makelabel##1{##1}^^A
+% \let\item\SOUL@@@verbitem
+% }^^A
+% }{^^A
+% \endlist
+% }
+%
+% \newenvironment{labeling}[1]{^^A
+% \list{}{^^A
+% \settowidth{\labelwidth}{\textbf{#1}}^^A
+% \leftmargin\labelwidth\advance\leftmargin\labelsep
+% \def\makelabel##1{\textbf{##1}\hfil}^^A
+% }^^A
+% }{^^A
+% \endlist
+% }
+%
+% \newenvironment{syntax}{^^A
+% \par\medskip\def\<##1>{$\langle$\syn{##1}$\rangle$}^^A
+% \indent\begin{tabular}{l}^^A
+% }{^^A
+% \end{tabular}^^A
+% \noindentafter\medbreak
+% }
+%
+%
+% \newenvironment{example}[1][.9\textwidth]
+% {\par\medskip\indent\begin{tabular}{p{#1}l}}
+% {\end{tabular}\noindentafter\medbreak}
+%
+% \newcommand*\noindentafter{^^A
+% \global\everypar{{\setbox\z@\lastbox}\everypar{}}}
+%
+% \newcommand*\errsquare{\leavevmode\vrule height.8em depth.2em width1em\relax}
+%
+%
+% \ifx\SOULSTYfound\active
+%^^A analyze syllables---described somewhere below
+%
+% \DeclareRobustCommand*\sy{^^A
+% \SOUL@setup
+% \def\SOUL@preamble{\lefthyphenmin0\righthyphenmin0}^^A
+% \def\SOUL@everysyllable{\the\SOUL@syllable}^^A
+% \def\SOUL@everyspace##1{##1\space}^^A
+% \def\SOUL@everyhyphen{^^A
+% \discretionary{^^A
+% \SOUL@setkern\SOUL@hyphkern
+% \SOUL@sethyphenchar
+% }{}{^^A
+% \hbox{\kern1pt$\cdot$}^^A
+% }^^A
+% }^^A
+% \def\SOUL@everyexhyphen##1{^^A
+% \SOUL@setkern\SOUL@hyphkern
+% \hbox{##1}^^A
+% \discretionary{}{}{^^A
+% \SOUL@setkern\SOUL@charkern
+% }^^A
+% }^^A
+% \SOUL@}
+%
+%^^A analyze the engine---described somewhere below, too
+%
+% \DeclareRobustCommand*\an{^^A
+% \def\SOUL@preamble{$^{^P}$}^^A
+% \def\SOUL@everyspace##1{##1\texttt{\char`\ }}^^A
+% \def\SOUL@postamble{$^{^E}$}^^A
+% \def\SOUL@everyhyphen{$^{^-}$}^^A
+% \def\SOUL@everyexhyphen##1{##1$^{^=}$}^^A
+% \def\SOUL@everysyllable{$^{^S}$}^^A
+% \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}^^A
+% \def\SOUL@everylowerthan{$^{^L}$}^^A
+% \SOUL@}
+%
+%^^A magazine-like (truly awful) paragraphs
+%^^A If you know what you're doing, you can copy it to your personal `soul.cfg' file.
+%
+% \DeclareRobustCommand*\magstylepar{\SOUL@sosetup
+% \def\SOUL@preamble{^^A
+% \edef\SOUL@soletterskip{\z@\@plus\fontdimen2\font\@minus\z@}^^A
+% \edef\SOUL@soinnerskip{\the\fontdimen2\font
+% \@plus\the\fontdimen3\font\@minus\the\fontdimen4\font}^^A
+% \let\SOUL@soouterskip\SOUL@soinnerskip
+% \SOUL@sopreamble}^^A
+% \lefthyphenmin2\righthyphenmin2\SOUL@}
+%
+%\else
+%
+%^^A The package has not been found, so we're providing some dummies, just
+%^^A to avoid all these `Undefined command sequence' messages.
+%
+% \def\SOUL@@@X#1{\textbf{??}}%
+% \let\so\SOUL@@@X
+% \let\textso\SOUL@@@X
+% \let\caps\SOUL@@@X
+% \let\textcaps\SOUL@@@X
+% \let\ul\SOUL@@@X
+% \let\textul\SOUL@@@X
+% \let\st\SOUL@@@X
+% \let\textst\SOUL@@@X
+% \let\hl\SOUL@@@X
+% \let\texthl\SOUL@@@X
+% \let\sy\SOUL@@@X
+% \let\an\SOUL@@@X
+% \let\magstylepar\SOUL@@@X
+% \let\sloppyword\SOUL@@@X
+% \def\sodef#1#2#3#4{\let#1\relax\SOUL@@@X}%
+% \fi
+%
+% \newcommand*\xpath{^^A
+% \bgroup
+% \let\do\@makeother
+% \dospecials
+% \catcode`\{=1
+% \catcode`\}=2
+% \def\{{\char"7B}^^A
+% \def\}{\char"7D}^^A
+% \SOUL@@@code
+% }
+%
+% \newcommand*\SOUL@@@code[1]{\normalfont\texttt{#1}\egroup}
+%
+% \let\cs\xpath
+% \let\option\textsf
+% \def\package#1{{\normalfont\texttt{#1}}}
+% \let\program\texttt
+% \let\bibtitle\textit
+% \let\syn\textit
+%
+% \sodef\person{\scshape}{0.06em}{0.45em}{0.4em}
+% \sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}
+% \DeclareRobustCommand*\versal[1]{^^A
+% \MakeUppercase{\SOUL@@@versal{#1}}^^A
+% }
+%
+% \def\ConTeXt{Con\TeX t}
+% \def\CTAN{{\small\caps{CTAN}}}
+% \def\soul{\package{soul-ori}}
+%
+% ^^A set some parameters as used in Plain TeX
+% \def\plainsetup{^^A
+% \pretolerance100
+% \tolerance200
+% \hbadness1000
+% \linepenalty10
+% \hyphenpenalty50
+% \exhyphenpenalty50
+% \doublehyphendemerits10000
+% \finalhyphendemerits5000
+% \adjdemerits10000
+% \hfuzz.1pt
+% \overfullrule5pt
+% }
+%
+% \def\FIXME#1{\message{<FIXME>}#1}
+%
+% \makeatother
+%
+%
+% \lefthyphenmin2
+% \righthyphenmin3
+% \hyphenation{Le-se-ty-po-gra-phie Ver-bin-dung fak-si-mi-le}
+%
+%
+%^^A=====================================================
+%
+%
+% \changes{v1.0}{1998/10/16}{Initial version}%
+%^^A due to an error in the documentation of v1.0, there's no v1.1 :-(
+% \changes{v1.1a}{1998/12/08}{fixed a bunch of bugs; `magstylepar command
+% banned; `caps introduced; `so and `caps recognize following spaces;
+% error message added; `so parameters are mandatory}
+%
+% \changes{v1.2}{1999/01/11}{fixed the newline bug; added the `\(>\) command}
+%
+% \changes{v1.3}{1999/05/15}{changed allowhyphen, preambles; added a paragraph
+% in the `features' section}
+%
+% \changes{v2.0}{2002/01/03}{(almost) complete rewrite}
+%
+% \changes{v2.1}{2002/01/10}{Happy (64th) birthday, Don!
+% ``The now-traditional fix for the
+% now-traditional brown-paper-bag major release.''
+% as Eric S. RAYMOND commented on his CML2.0.1 release. ;-)}
+%
+% \changes{v2.2}{2002/05/12}{fixed a couple of bugs; added support for
+% the Plain TeX color.sty wrapper}
+%
+% \changes{v2.3}{2002/05/29}{compatibility with cmbright/ccfonts}
+%
+% \changes{v2.4}{2003/11/17}{Fix the font bug. Fix a scanner bug.
+% Other bugfixes; change caps set handling; add footnote and
+% textsuperscript support}
+%
+% \changes{v2.5}{2021/12/14}{Allocate new registers, see issue 1 +2 at https://github.com/drehscheibe/soul,
+% renamed to soul-ori, to allow to merge it with soulutf8}
+%
+% \changes{v3.0}{2023/02/18}{the package has been merged with soulutf8}
+%
+%
+%
+% \maketitle
+%
+%
+%
+% \begin{abstract}
+% This article describes the \soul\ package^^A
+%^^A%%
+% \footnote{This file has version number \fileversion, last revised \filedate.},
+%^^A%%
+% which provides \so{hyphenatable letterspacing (spacing out),} \ul{underlining}
+% and some derivatives such as \st{overstriking} and highlighting.
+% Although the package is optimized for \LaTeXe, it also works with
+% Plain \TeX\ and with other flavors of \TeX\ like, for instance, \ConTeXt.
+% By the way, the package name |soul| is only a combination
+% of the two macro names \cs{\so} (space out) and \cs{\ul}
+% (underline)---nothing poetic at all.^^A :-(
+% \end{abstract}
+%
+%
+% {\setlength\parskip{0pt}\tableofcontents }
+% \addtocontents{toc}{\protect\begin{multicols}{2}}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Typesetting rules}
+% \label{sec:typesetting}
+%
+% There are several possibilities to emphasize parts of a paragraph,
+% not all of which are considered good style. While underlining
+% is commonly rejected, experts dispute about whether letterspacing
+% should be used or not, and in which cases. If you are not interested
+% in such debates, you may well skip to the next section.
+%
+%
+% \subsection*{Theory \dots}
+% \label{sec:theory}
+%
+% To understand the experts' arguments we have to know about the
+% conception of \emph{page grayness.} The sum of all characters on
+% a page represents a certain amount of grayness, provided that
+% the letters are printed black onto white paper.
+%
+% \person{Jan Tschichold} \cite{Tschichold}, a well known and recognized
+% typographer, accepts only forms of emphasizing, which do not disturb this
+% grayness. This is only true of italic shape, caps, and
+% caps-and-small-caps fonts, but not of ordinary letterspacing, underlining,
+% bold face type and so on, all of which appear as either dark or light
+% spots in the text area. In his opinion emphasized text shall not catch the eye when
+% running over the text, but rather when actually reading the respective words.
+%
+% Other, less restrictive typographers \cite{Willberg} call this kind of emphasizing
+% `integrated' or `aesthetic', while they describe `active' emphasizing apart from it,
+% which actually \emph{has} to catch the reader's eye. To the latter group belong commonly
+% despised things like letterspacing, demibold face type and even underlined and colored text.
+%
+% On the other hand, \person{Tschichold} suggests
+% to space out caps and caps-and-small-caps fonts on title pages, headings and running headers from
+% 1\,pt up to 2\,pt.
+% Even in running text legibility of uppercase letters should be improved with slight
+% letterspacing, since (the Roman) majuscules don't look right, if they are spaced
+% like (the Carolingian) minuscules.\footnote{This suggestion is followed throughout this article,
+% although Prof.~\person{Knuth} already considered slight letterspacing with his |cmcsc| fonts.}
+%
+%
+%
+%\subsection*{\dots\ and Practice}
+%
+% However, in the last centuries letterspacing was excessively used,
+% underlining at least sometimes, because capitals and italic shape could
+% not be used together with the \emph{Fraktur} font and other black-letter fonts,
+% which are sometimes also called ``old German'' fonts.
+% This tradition is widely continued until today. The same limitations apply still today
+% to many languages with non-latin glyphs, which is why letterspacing has a strong
+% tradition in eastern countries where Cyrillic fonts are used.
+%
+% The \person{Duden} \cite{Duden}, a well known German dictionary, explains how to space out properly:
+% \emph{Punctuation marks are spaced out like letters, except quotation marks and periods.
+% Numbers are never spaced out. The German syllable \mbox{\emph{-sche}} is not spaced
+% out in cases like \emph{``der {\so{Virchow{sche}}} Versuch''}\footnote{the \person{Virchow} experiment}.
+% In the old German \emph{Fraktur} fonts the ligatures \emph{|ch|, |ck|, |sz|~(\ss)} and~\emph{|tz|} are
+% not broken within spaced out text.}
+%
+% While some books follow all these rules \cite{Muszynski}, others don't
+% \cite{Reglement}. In fact, most books in my personal library do \emph{not} space out commas.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Short introduction and common rules}
+%
+% The \soul\ package provides five commands that are aimed at emphasizing
+% text parts. Each of the commands takes one argument that can either be
+% the text itself or the name of a macro that contains text (e.\,g.~|\so\text|)^^A
+% ^^A
+% \footnote{See~\ref{par:Unexpandable material in command sequences} for
+% some additional information about the latter mode.}^^A
+% ^^A
+% .
+% See table~\ref{tab:survey} for a complete command survey.
+%
+% {\catcode`\|=12
+% \begin{center}
+% \begin{tabular}{r@{\hspace{1.5em}}l}
+% \verb+\so{letterspacing}+&\so{letterspacing}\\
+% \verb+\caps{CAPITALS, Small Capitals}+&\caps{CAPITALS, Small Capitals}\\
+% \verb+\ul{underlining}+&\ul{underlining}\\
+% \verb+\st{overstriking}+&\st{overstriking}\\
+% \verb+\hl{highlighting}+&highlighting\footnotemark\\
+% \end{tabular}
+% \end{center}
+% \footnotetext{The look of highlighting is nowhere demonstrated
+% in this documentation, because it requires a Postscript aware
+% output driver and would come out as ugly black bars on other
+% devices, looking very much like censoring bars. Think of it as
+% the effect of one of those coloring text markers.}
+% }
+%
+% \noindent
+% The \cs{\hl} command does only highlight if the \package{color} package
+% was loaded, otherwise it falls back to underlining.\footnote{Note that
+% you can also use \LaTeX's \package{color} package with Plain \TeX.
+% See~\ref{sec:plain} for details.} The highlighting
+% color is by default yellow, underlines and overstriking lines are by
+% default black. The colors can be changed using the following commands:
+%
+% {\catcode`\|=12
+% \begin{center}
+% \begin{tabular}{r@{\hspace{1.5em}}l}
+% \verb+\setulcolor{red}+&set underlining color\\
+% \verb+\setstcolor{green}+&set overstriking color\\
+% \verb+\sethlcolor{blue}+&set highlighting color\\
+% \end{tabular}
+% \end{center}
+% }
+%
+% \noindent
+% |\setulcolor{}| and |\setstcolor{}| turn coloring off.
+% There are only few colors predefined by the \package{color}
+% package, but you can easily add custom color definitions.
+% See the \package{color} package documentation~\cite{color} for further
+% information.
+%
+% \begin{example}
+% |\usepackage{color,soul}|\\
+% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
+% |\sethlcolor{lightblue}|\\
+% |...|\\
+% |\hl{this is highlighted in light blue color}|\\
+% \end{example}
+%
+%
+%
+%
+%
+%
+%
+% \subsection[Some things work]{Some things work \dots}
+%
+% The following examples may look boring and redundant, because they describe
+% nothing else than common \LaTeX\ notation with a few exceptions, but this is
+% only the half story: The \soul\ package has to pre-process the argument
+% before it can split it into characters and syllables, and all described
+% constructs are only allowed because the package explicitly implements them.
+%
+% \begin{verblist}{1}
+% \item[Accents: \so{na\"\i ve}]
+% Accents can be used naturally.
+% Support for the following accents is built-in: |\`|, |\'|, |\^|, |\"|, |\~|,
+% |\=|, |\.|, |\u|, |\v|, |\H|, |\t|, |\c|, |\d|, |\b|, and |\r|. Additionally,
+% if the \package{german} package \cite{german} is loaded you can also use the |"|
+% accent command and write |\so{na"ive}|. See section~\ref{sec:soulaccent} for how to add
+% further accents.
+% \item[Quotes: \so{``quotes''}]
+% The \soul\ package recognizes the quotes ligatures |``|, |''| and |,,|.
+% The Spanish ligatures |!`| and |?`| are not recognized and have, thus,
+% to be written enclosed in braces like in |\caps{{!`}Hola!}|.
+% \item[Mathematics: \so{foo$x^3$bar}]
+% Mathematic formulas are allowed, as long as they are
+% surrounded by~\texttt\$. Note that the \LaTeX\
+% equivalent |\(...\)| does not work.
+% \item[Hyphens and dashes: \so{re-sent}]
+% Explicit hyphens as well as en-dashes~(|--|), em-dashes~(|---|)
+% and the |\slash| command work as usual.
+% \item[Newlines: \so{new\\line}]
+% The |\\|~command fills the current line with white space
+% and starts a new line. Spaces or linebreaks afterwards are ignored.
+% Unlike the original \LaTeX\ command \soul's version does not handle
+% optional parameters like in |\\*[1ex]|.
+% \item[Breaking lines: \so{foo\linebreak bar}]
+% The \cs{\linebreak} command breaks the line without
+% filling it with white space at the end. \soul's version
+% does not handle optional parameters like in |\linebreak[1]|.
+% \cs{\break} can be used as a synonym.
+% \item[Unbreakable spaces: \so{don't~break}]
+% The |~|~command sets an unbreakable space.
+% \item[Grouping: \so{Virchow{sche}}]
+% A pair of braces can be used to let a group of characters
+% be seen as one entity, so that \soul\ does
+% for instance not space it out. The contents must, however,
+% not contain potential hyphenation points. (See~\ref{par:Protecting})
+% \item[Protecting: \so{foo \mbox{little} bar}]
+% An \cs{\mbox} also lets \soul\ see the contents as one
+% item, but these may even contain hyphenation points. \cs{\hbox} can
+% be used as a synonym.
+% \item[Omitting: \so{\soulomit{foo}}]
+% The contents of \cs{\soulomit} bypass the soul core and are typeset
+% as is, without being letterspaced or underlined. Hyphenation points are
+% allowed within the argument. The current font remains active, but can be
+% overridden with \cs{\normalfont} etc.
+% \item[Font switching commands: \so{foo \texttt{bar}}]
+% All standard \TeX\ and \LaTeX\ font switching commands are allowed, as
+% well as the \package{yfonts} package \cite{yfonts} font commands like \cs{\textfrak} etc.
+% Further commands have to be registered using the \cs{\soulregister}
+% command (see section~\ref{sec:soulregister}).
+% \item[Breaking up ligatures: \ul{Auf{}lage}]
+% Use |{}| or \cs{\null} to break up ligatures like `fl' in \cs{\ul}, \cs{\st} and \cs{\hl}
+% arguments.
+% This doesn't make sense for \cs{\so} and \cs{\caps}, though, because they break up
+% every unprotected (ungrouped\slash unboxed) ligature, anyway, and would
+% then just add undesirable extra space around the additional item.
+% \end{verblist}
+%
+%
+%
+%
+% \subsection{\dots\ others don't}
+%
+% Although the new \soul\ is much more robust and forgiving than
+% versions prior to~2.0, there are
+% still some things that are not allowed in arguments.
+% This is due to the complex engine, which has to read and inspect every
+% character before it can hand it over to \TeX's paragraph builder.
+%
+% \begin{verblist}{20}
+% \item[Grouping hyphenatable material: \so{foo {little} bar}]
+% Grouped characters must not contain hyphenation points. Instead of
+% |\so{foo {little}}| write |\so{foo \mbox{little}}|. You get a
+% \texttt{`Re\-con\-struction failed'} error and a black square like
+% \errsquare\ in the \caps{DVI} file where you violated this rule.
+% \item[Discretionary hyphens: \so{Zu\discretionary{k-}{}{c}ker}]
+% The argument must not contain discretionary hyphens. Thus, you have to
+% handle cases like the German word |Zu\discretionary{k-}{}{c}ker| by yourself.
+% \item[Nested soul commands: \ul{foo \so{bar} baz}]
+% \soul\ commands must not be nested. If you really
+% need such, put the inner stuff in a box and use this box. It will, of
+% course, not get broken then.\\
+% \null\qquad|\newbox\anyboxname|\\
+% \null\qquad|\sbox\anyboxname{ \so{the worst} }|\\
+% \null\qquad|\ul{This is by far{\usebox\anyboxname}example!}|\\
+% yields:\\
+% \newbox\anyboxname
+% \sbox\anyboxname{ \so{the worst} }
+% \null\qquad\ul{This is by far{\usebox\anyboxname}example!}
+% \item[Leaking font switches: \def\foo{\bf bar} \so{\foo baz}]
+% A hidden font switching command that leaks into its neighborship
+% causes a \texttt{`Reconstruction failed'} error. To avoid this either
+% register the `container' (|\soulregister{\foo}{0}|), or limit its
+% scope as in |\def\foo{{\bf bar}}|. Note that both
+% solutions yield slightly different results.
+% \item[Material that needs expansion: \so{\romannumeral\year}]
+% In this example \cs{\so} would try to put space between \cs{\romannumeral}
+% and \cs{\year}, which can, of course, not work.
+% You have to expand the argument before you feed it to \soul, or even better:
+% Wrap the material up in a command sequence and let \soul\ expand it:
+% |\def\x{\romannumeral\year}| |\so\x|. \soul\ tries hard to expand
+% enough, yet not too much.
+% \item[Unexpandable material in command sequences: \def\foo{\bar} \so\foo]
+% Some macros might not be expandable in an \cs{\edef} definition^^A
+% \footnote{Try \texttt{\string\edef\string\x\char`\{\string\copyright\char`\}}.
+% Yet \texttt{\string\copyright} works in \soul\ arguments, because it is
+% explicitly taken care of by the package}
+% and have to be protected with \cs{\noexpand} in front. This is automatically done
+% for the following tokens: |~|, \cs{\,}, \cs{\TeX}, \cs{\LaTeX},
+% \cs{\S}, \cs{\slash}, \cs{\textregistered}, \cs{\textcircled}, and \cs{\copyright},
+% as well as for all registered fonts and accents. Instead of putting \cs{\noexpand}
+% manually in front of such commands, as in |\def\foo{foo {\noexpand\bar} bar}| |\so\foo|,
+% you can also register them as special (see section \ref{sec:soulregister}).
+% \item[Other weird stuff: \so{foo \verb|\bar| baz}]
+% \soul\ arguments must not contain \LaTeX\ environments, command definitions,
+% and fancy stuff like |\vadjust|. \soul's |\footnote| command replacement
+% does not support optional arguments. As long as you are writing simple,
+% ordinary `horizontal' material, you are on the safe side.
+% \end{verblist}
+%
+%
+%
+%
+%
+%
+%
+% \begin{table}
+% \begin{center}
+% \catcode`\|=12
+% \newcommand*\pref[1]{{\footnotesize\pageref{cmd:#1}}}
+% \newcommand*\Ast{\rlap{$^\ast$}}
+% \let\m\cs
+% \let\ti\textit
+% \begin{tabular}{r@{\hspace{.6em}}c@{\hspace{.6em}}l}
+% &\hbox to0pt{\hss\footnotesize page\hss}&\\[.5ex]
+% \verb+\so{letterspacing}+& \pref{so} &\so{letterspacing}\\
+% \verb+\caps{CAPITALS, Small Capitals}+& \pref{caps} &\caps{CAPITALS, Small Capitals}\\
+% \verb+\ul{underlining}+& \pref{ul} &\ul{underlining}\\
+% \verb+\st{striking out}+& \pref{st} &\st{striking out}\\
+% \verb+\hl{highlighting}+& \pref{hl} &highlighting\\
+% \\
+% \verb+\soulaccent{\cs}+& \pref{soulaccent} &\ti{add accent} \cs{\cs} \ti{to accent list}\\
+% \verb+\soulregister{\cs}{0}+& \pref{soulregister} &\ti{register command} \m{\cs}\\
+% \verb+\sloppyword{text}+& \pref{sloppyword} &\ti{typeset} \m{text} \ti{with stretchable spaces}\\
+% \\
+% \verb+\sodef\cs{1em}{2em}{3em}+& \pref{sodef} &\ti{define new spacing command} \m{\cs}\\
+% \verb+\resetso+& \pref{resetso} &\ti{reset} \m{\so} \ti{dimensions}\\
+% \verb+\capsdef{////}{1em}{2em}{3em}+\Ast& \pref{capsdef} &\ti{define (default)} \m{\caps} \ti{data entry}\\
+% \verb+\capssave{name}+\Ast& \pref{capssave} &\ti{save} \m{\caps} \ti{database under name} \rlap{\texttt{name}}\\
+% \verb+\capsselect{name}+\Ast& \pref{capssave} &\ti{restore} \m{\caps} \ti{database of name} \rlap{\texttt{name}}\\
+% \verb+\capsreset+\Ast& \pref{capsreset} &\ti{clear caps database}\\
+% \verb+\setul{1ex}{2ex}+& \pref{setul} &\ti{set} \m{\ul} \ti{dimensions}\\
+% \verb+\resetul+& \pref{resetul} &\ti{reset} \m{\ul} \ti{dimensions}\\
+% \verb+\setuldepth{y}+& \pref{setuldepth} &\ti{set underline depth to depth of an} y\\
+% \verb+\setuloverlap{1pt}+& \pref{setuloverlap} &\ti{set underline overlap width}\\
+% \verb+\setulcolor{red}+& \pref{setulcolor} &\ti{set underline color}\\
+% \verb+\setstcolor{green}+& \pref{setstcolor} &\ti{set overstriking color}\\
+% \verb+\sethlcolor{blue}+& \pref{sethlcolor} &\ti{set highlighting color}\\
+% \end{tabular}
+% \caption{List of all available commands. The number points to the
+% page where the command is described. Those marked
+% with a little asterisk are only available when the package
+% is used together with \LaTeX, because they rely on the
+% \emph{New Font Selection Scheme (NFSS)} used in \LaTeX.}
+% \label{tab:survey}
+% \end{center}
+% \end{table}
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Troubleshooting}
+%
+% Unfortunately, there's just one helpful error message provided by
+% the \soul\ package, that actually describes the underlying problem. All other
+% messages are generated directly by \TeX\ and show the low-level
+% commands that \TeX\ wasn't happy with. They'll hardly point you
+% to the violated rule as described in the paragraphs above.
+% If you get such a mysterious error message for a line that contains
+% a \soul\ statement, then comment that statement out and see if the message
+% still appears.
+% \texttt{`Incomplete }\cs{\ifcat}\texttt{'} is such a non-obvious message.
+% If the message doesn't appear now, then check the argument for
+% violations of the rules as listed in~\S\S\,20--26.
+%
+%
+%
+% \subsubsection{\texttt{`Reconstruction failed'}}
+%
+% This message appears, if \ref{par:Grouping hyphenatable material} or
+% \ref{par:Leaking font switches} was
+% violated. It is caused by the fact that the reconstruction pass
+% couldn't collect tokens with an overall width of the syllable that
+% was measured by the analyzer. This does either occur when you
+% grouped hyphenatable text or used an unregistered command
+% that influences the syllable width. Font switching commands belong
+% to the latter group. See the above cited sections for how to fix
+% these problems.
+%
+%
+%
+% \subsubsection{Missing characters}
+%
+% If you have redefined the internal font as described in section \ref{sec:internalfont},
+% you may notice that some characters are omitted without any error message
+% being shown. This happens if you have chosen, let's say, a font with
+% only 128~characters like the |cmtt10| font, but are using characters
+% that aren't represented in this font, e.\,g.~characters with codes
+% greater than~127.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{\so{Letterspacing}}
+%
+% \subsection{How it works}
+% \label{sec:so}
+%
+% The base macro for letterspacing is called \describemacro{\so}.
+% It typesets the given argument with \syn{inter-letter space}
+% between every two characters, \syn{inner space} between words
+% and \syn{outer space} before and after the spaced out text.
+% If we let ``$\cdot$'' stand for \syn{inter-letter space}, ``$\ast$''
+% for \syn{inner spaces} and ``$\bullet$'' for \syn{outer
+% spaces,} then the input on the left side of the following table
+% will yield the schematic output on the right side:
+%
+% \begin{center}
+% \def\.{$\cdot$}
+% \def\-{\kern1pt$\ast$\kern1pt}
+% \def\*{$\bullet$}
+% \def\_{\texttt{\char"20}}
+% \begin{tabular}{ccc}
+% 1.& \verb*|XX\so{aaa bbb ccc}YY|& \textsf{XXa\.a\.a\-b\.b\.b\-c\.c\.cYY}\\
+% 2.& \verb*|XX \so{aaa bbb ccc} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
+% 3.& \verb*|XX {\so{aaa bbb ccc}} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
+% 4.& \verb*|XX \null{\so{aaa bbb ccc}}{} YY|& \textsf{XX\_a\.a\.a\-b\.b\.b\-c\.c\.c\_YY}\\
+% \end{tabular}
+% \end{center}
+% ^^A* % fool vim (fixes syntax highlighting)
+%
+% \noindent
+% Case~1 shows how letterspacing macros (\cs{\so} and \cs{\caps}) behave if
+% they aren't following or followed by a space: they omit outer space around
+% the \soul\ statement. Case~2 is what you'll mostly need---letterspaced
+% text amidst running text. Following and leading space get replaced by
+% \syn{outer space}. It doesn't matter if there are opening braces before
+% or closing braces afterwards. \soul\ can see through both of them (case~3).
+% Note that leading space has to be at least |5sp| wide to be recognized as
+% space, because \LaTeX\ uses tiny spaces generated by |\hskip1sp| as marker.
+% Case~4 shows how to enforce normal spaces instead of \syn{outer spaces:}
+% Preceding space can be hidden by |\kern0pt| or \cs{\null} or any character.
+% Following space can also be hidden by any token, but note that a typical macro name
+% like \cs{\relax} or \cs{\null} would also hide the space thereafter.
+%
+%
+% The values are predefined for typesetting facsimiles mainly with
+% \emph{Fraktur} fonts.
+% You can define your own spacing
+% macros or overwrite the original \cs{\so} meaning using the macro
+% \describemacro{\sodef}:
+%
+% \begin{syntax}
+% |\sodef|\<cmd>|{|\<font>|}{|\<inter-letter space>|}{|\<inner space>|}{|\<outer space>|}|
+% \end{syntax}
+%
+% The space dimensions, all of which are mandatory, should be defined in terms of |em|
+% letting them grow and shrink with the respective fonts.
+%
+% \begin{example}
+% |\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}|
+% \end{example}
+%
+% After that you can type `|\an{example}|' to get
+% {\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}^^A
+% `\an{example}'.}
+% The \describemacro{\resetso} command resets \cs{\so}
+% to the default values.
+%
+%
+%
+%
+% \subsection{Some examples}
+%
+%^^A=====================================================
+% \begin{examples}
+%
+% \soultest{Ordinary text}
+% |\so{electrical industry}|
+% {\so{electrical industry}}
+%
+% \soultest{Use \texttt{\string\-} to mark hyphenation points}
+% |\so{man\-u\-script}|
+% {\so{man\-u\-script}}
+%
+% \soultest{Accents are recognized}
+% |\so{le th\'e\^atre}|
+% {\so{le th\'e\^atre}}
+%
+% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
+% contains hyphenation points. The contents are treated as one, unbreakable entity}
+% |\so{just an \mbox{example}}|
+% {\so{just an \mbox{example}}}
+%
+% \soultest{Punctuation marks are spaced out, if they are
+% put into the group}
+% |\so{inside.} \& \so{outside}.|
+% {\so{inside.} \& \so{outside}.}
+%
+% \soultest{Space-out skips may be removed by typing \texttt{\string\<}.
+% It's, however, desirable to put the quotation marks out of
+% the argument}
+% |\so{``\<Pennsylvania\<''}|
+% {\so{``\<Pennsylvania\<''}}
+%
+% \soultest{Numbers should never be spaced out}
+% |\so{1\<3 December {1995}}|
+% {\so{1\<3 December {1995}}}
+%
+% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
+% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
+% afterwards}
+% |\so{input\slash output}|
+% {\so{input\slash output}}
+%
+% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
+% you have to protect the hyphen. This is no \soul\ restriction
+% but normal \TeX\ behavior}
+% |\so{\dots and \mbox{-}jet}|
+% {\so{\dots and \mbox{-}jet}}
+%
+% \soultest{The \texttt{\~} command inhibits line breaks}
+% |\so{unbreakable~space}|
+% {\so{unbreakable~space}}
+%
+% \soultest{\texttt{\string\\} works as usual. Additional arguments
+% like \texttt{*} or vertical space are not accepted, though}
+% |\so{broken\\line}|
+% {\so{broken\\line}}
+%
+% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
+% |\so{pretty awful\break test}|
+% {\so{pretty awful\break test}}
+%
+% \end{examples}
+%^^A=====================================================
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection[Typesetting \caps{caps-and-small-caps} fonts]
+% {Typesetting capitals-and-small-capitals fonts}
+%
+% There is a special letterspacing command called \describemacro{\caps},
+% which differs from \cs{\so} in that it switches to caps-and-small-caps
+% font shape, defines only slight spacing and is able to select spacing
+% value sets from a database. This is a requirement for high-quality
+% typesetting \cite{Tschichold}. The following lines show the effect
+% of \cs{\caps} in comparison with the normal textfont and with
+% small-capitals shape:
+%
+% \def\sampletext{DONAUDAMPFSCHIFFAHRTSGESELLSCHAFT}
+% \medskip\noindent
+% \begin{tabular}{rl}
+% |\normalfont|&\sampletext\\
+% |\scshape|&{\scshape\sampletext}\\
+% |\caps|&\caps\sampletext\\
+% ^^A|\person|&\person\sampletext\\
+% \end{tabular}
+%
+% \medbreak\noindent
+% The \cs{\caps} font database is by default empty, i.\,e., it contains
+% just a single default entry, which yields the result as shown in the
+% example above.
+% New font entries may be added \emph{on top} of this list using the \describemacro{\capsdef}
+% command, which takes five arguments: The first argument describes the font with
+% \emph{encoding, family, series, shape,} and \emph{size,}^^A
+% \footnote{as defined by the \caps{NFSS}, the ``New Font Selection Scheme''}
+% each optionally
+% (e.\,g.~|OT1/cmr/m/n/10| for this very font, or only |/ppl///12| for all
+% \emph{palatino} fonts at size 12\,pt). The \emph{size} entry may also contain
+% a size range (\texttt{5-10}), where zero is assumed for an omitted lower
+% boundary (\texttt{-10}) and a very, very big number for an omitted upper
+% boundary (\texttt{5-}). The
+% upper boundary is not included in the range, so, in the example below, all
+% fonts with sizes greater or equal 5\,pt and smaller than 15\,pt are accepted
+% ($5\,\mbox{pt}\le size<15\,\mbox{pt}$).
+% The second argument may contain font switching commands such as \cs{\scshape},
+% it may as well be empty or contain debugging commands (e.\,g.~|\message{*}|).
+% The remaining three, mandatory arguments are the spaces as described in
+% section~\ref{sec:so}.
+%
+% \begin{example}
+% |\capsdef{T1/ppl/m/n/5-15}{\scshape}{.16em}{.4em}{.2em}|
+% \end{example}
+%
+% The \cs{\caps} command goes through the data list from top to bottom
+% and picks up the first matching set, so the order of definition is essential.
+% The last added entry is examined first, while the pre-defined default entry
+% will be examined last and will match any font, if no entry was taken before.
+%
+% To override the default values, just define a new default entry using
+% the identifier |{////}|. This entry should be defined first, because no
+% entry after it can be reached.
+%
+% The \cs{\caps} database can be cleared with the \describemacro{\capsreset}
+% command and will only contain the default entry thereafter. The
+% \describemacro{\capssave} command saves the whole current database
+% under the given name. \describemacro{\capsselect} restores such a database.
+% This allows to predefine different groups of \cs{\caps} data sets:
+%
+% \begin{example}
+% |\capsreset|\\
+% |\capsdef{/cmss///12}{}{12pt}{23pt}{34pt}|\\
+% |\capsdef{/cmss///}{}{1em}{2em}{3em}|\\
+% |...|\\
+% |\capssave{wide}|\\
+% \end{example}
+% \indent
+% \begin{example}
+% |%---------------------------------------|\\
+% |\capsreset|\\
+% |\capsdef{/cmss///}{}{.1em}{.2em}{.3em}|\\
+% |...|\\
+% |\capssave{narrow}|\\
+% \end{example}
+% \indent
+% \begin{example}
+% |%---------------------------------------|\\
+% |{\capsselect{wide}|\\
+% |\title{\caps{Yet Another Silly Example}}|\\
+% |}|\\
+% \end{example}
+%
+% See the `|example.cfg|' file for a detailed example.
+% If you have defined a bunch of sets for different fonts and sizes,
+% you may lose control over what fonts are used by the package. With the
+% package option \DescribeOption{capsdefault}\option{capsdefault} selected,
+% \cs{\caps} prints its argument underlined, if no set was specified for a
+% particular font and the default set had to be used.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Typesetting Fraktur}
+% \label{sec:fraktur}
+%
+% Black letter fonts^^A
+%^^A%%
+% \footnote{See the great black letter fonts, which \person{Yannis Haralambous}
+% kindly provided, and the \package{oldgerm} and \package{yfonts} package~\cite{yfonts}
+% as their \LaTeX\ interfaces.}
+%^^A%%
+% deserve some additional considerations. As stated in section~\ref{sec:typesetting},
+% the ligatures |ch|, |ck|, |sz|~(\cs{\ss}), and~|tz| have to remain unbroken in spaced out
+% \emph{Fraktur} text. This may look strange at first glance, but you'll get used to it:
+%
+% \begin{example}
+% |\textfrak{\so{S{ch}u{tz}vorri{ch}tung}}|
+% \end{example}
+%
+% You already know that grouping keeps the |soul| mechanism from separating such ligatures.
+% This is quite important for |s:|, |a*|, and~|"a|. As hyphenation is stronger than
+% grouping, especially the |sz| may cause an error, if hyphenation happens to occur between
+% the letters |s| and~|z|. (\TeX\ hyphenates the German word |auszer| wrongly like
+% |aus-zer| instead of like |au-szer|, because the German hyphenation patterns
+% do, for good reason, not see |sz| as `\cs{\ss}'.) In such cases you can protect tokens with the
+% sequence e.\,g.~|\mbox{sz}| or a properly defined command. The \cs{\ss} command,
+% which is defined by the \package{yfonts} package, and similar commands will suffice as well.
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Dirty tricks}
+% \label{sec:dirtytricks}
+%
+% Narrow columns are hard to set, because they don't allow much spacing
+% flexibility, hence long words often cause overfull boxes. A macro
+% could use \cs{\so} to insert stretchability between the single
+% characters. Table~\ref{tab:dirtytricks} shows some text typeset with such
+% a macro at the left side and under \emph{plain} conditions at
+% the right side, both with a width of~6\,pc.
+%
+% \def\sampletext{Some magazines and newspapers prefer this kind of spacing
+% because it reduces hyphenation problems to a minimum\<. Unfortunately\<, such
+% paragraphs aren't especially beautiful\<.}
+% \newbox\dirtytrick
+% \setbox\dirtytrick\vbox{
+% \batchmode ^^A we don't want to see all these overfull boxes ...
+% \leavevmode\hspace{0ptplus1fil}
+% \hbox{\parindent0pt\plainsetup\let\<\relax
+% \vtop{\hsize6pc\raggedright\sampletext}\hskip1em
+% \vtop{\hsize6pc\magstylepar\sampletext}\hskip1em
+% \vtop{\hsize6pc\sampletext}\hss}
+% \errorstopmode}
+%
+% \begin{table}
+% \begin{center}
+% \overfullrule5pt
+% \usebox\dirtytrick
+% \caption{Ragged-right, magazine style (using \soul), and block-aligned
+% in comparison. But, frankly, none of them is really acceptable.
+% (Don't do this at home, children!)}
+% \label{tab:dirtytricks}
+% \end{center}
+% \end{table}
+%
+%
+%
+%
+%
+%
+%
+% \section{\ul{Underlining}}
+%
+% The underlining macros are my answer to Prof.~\person{Knuth'{\normalfont s}}
+% exercise 18.26 from his \TeX{}book~\cite{DEK}. \texttt{:-)} Most of what
+% is said about the macro \describemacro{\ul} is also true of the
+% striking out macro \describemacro{\st} and the highlighting macro \describemacro{\hl},
+% both of which are in fact derived from the former.
+%
+%
+%
+%
+% \subsection{Settings}
+%
+% \subsubsection{Underline depth and thickness}
+%
+% The predefined \syn{underline depth} and \syn{thickness}
+% work well with most fonts. They can be changed using the macro \describemacro{\setul}.
+%
+% \begin{syntax}
+% |\setul{|\<underline depth>|}{|\<underline thickness>|}|
+% \end{syntax}
+%
+% Either dimension can be omitted, in which case there has to be
+% an empty pair of braces.
+% Both values should be defined in terms of |ex|, letting them
+% grow and shrink with the respective fonts.
+% The \describemacro{\resetul} command restores the standard values.
+%
+% Another way to set the \syn{underline depth} is to use the macro
+% \describemacro{\setuldepth}. It sets the depth such that the
+% underline's upper edge lies 1\,pt beneath the given argument's
+% deepest depth. If the argument is empty, all
+% letters---i.\,e.\ all characters whose \cs{\catcode} currently
+% equals 11---are taken. Examples:
+%
+% \begin{example}
+% |\setuldepth{ygp}|\\
+% |\setuldepth\strut|\\
+% |\setuldepth{}|\\
+% \end{example}
+%
+%
+%
+% \subsubsection{Line color}
+%
+% The underlines are by default black. The color can be changed by
+% using the \describemacro{\setulcolor} command. It takes one argument that can be any
+% of the color specifiers as described in the |color| package. This package
+% has to be loaded explicitly.
+%
+% \indent
+% \begin{example}
+% |\documentclass{article}|\\
+% |\usepackage{color,soul}|\\
+% |\definecolor{darkblue}{rgb}{0,0,0.5}|\\
+% |\setulcolor{darkblue}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\begin{document}|\\
+% |...|\\
+% |\ul{Cave: remove all the underlines!}|\\
+% |...|\\
+% |\end{document}|\\
+% \end{example}
+%
+%
+% The colors for overstriking lines and highlighting are likewise set
+% with \describemacro{\setstcolor} (default: black) and \describemacro{\sethlcolor}
+% (default: yellow). If the \package{color} package wasn't loaded,
+% underlining and overstriking color are black, while highlighting
+% is replaced by underlining.
+%
+%
+%
+%
+%
+%
+%
+% \subsubsection{The \program{dvips} problem}
+% \label{sec:dvips}
+%
+% \ul{Underlining}, \st{striking out} and highlighting build up
+% their lines with many short line segments. If you used the `\program{dvips}'
+% program with default settings, you would get little gaps on some places, because
+% the \emph{maxdrift} parameter allows the single objects to drift
+% this many pixels from their real positions.
+% \bigbreak
+%
+% \noindent
+% There are two ways to avoid the problem, where the \soul\ package
+% chooses the second by default:
+% \begin{enumerate}
+% \item
+% Set the \emph{maxdrift} value to zero, e.\,g.: |dvips -e 0 file.dvi|.
+% This is probably not a good idea, since the letters may then no longer be
+% spaced equally on low resolution printers.
+% \item
+% Let the lines stick out by a certain amount on each side so that they
+% overlap. This overlap amount can be set using the \describemacro{\setuloverlap}
+% command. It is set to 0.25\,pt by default. |\setuloverlap{0pt}| turns overlapping off.
+% \end{enumerate}
+%
+%
+%
+%
+%
+%
+% \subsection{Some examples}
+%
+%^^A=====================================================
+% \begin{examples}
+%
+% \soultest{Ordinary text}
+% |\ul{electrical industry}|
+% {\ul{electrical industry}}
+%
+% \soultest{Use \texttt{\string\-} to mark hyphenation points}
+% |\ul{man\-u\-script}|
+% {\ul{man\-u\-script}}
+%
+% \soultest{Accents are recognized}
+% |\ul{le th\'e\^atre}|
+% {\ul{le th\'e\^atre}}
+%
+% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
+% contains hyphenation points. The contents are treated as one, unbreakable entity}
+% |\ul{just an \mbox{example}}|
+% {\ul{just an \mbox{example}}}
+%
+% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
+% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
+% afterwards}
+% |\ul{input\slash output}|
+% {\ul{input\slash output}}
+%
+% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
+% you have to protect the hyphen. This is no \soul\ restriction
+% but normal \TeX\ behavior}
+% |\ul{\dots and \mbox{-}jet}|
+% {\ul{\dots and \mbox{-}jet}}
+%
+% \soultest{The \texttt{\~} command inhibits line breaks}
+% |\ul{unbreakable~space}|
+% {\ul{unbreakable~space}}
+%
+% \soultest{\texttt{\string\\} works as usual. Additional arguments
+% like \texttt{*} or vertical space are not accepted, though}
+% |\ul{broken\\line}|
+% {\ul{broken\\line}}
+%
+% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
+% |\ul{pretty awful\break test}|
+% {\ul{pretty awful\break test}}
+%
+% \soultest{Italic correction needs to be set manually}
+% |\ul{foo \emph{bar\/} baz}|
+% {\ul{foo \emph{bar\/} baz}}
+%
+% \end{examples}
+%^^A=====================================================
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Customization}
+%
+% \subsection{Adding accents}
+% \label{sec:soulaccent}
+%
+% The \soul\ scanner generally sees every input token separately.
+% It has to be taught that some tokens belong together. For accents this is done
+% by registering them via the \describemacro{\soulaccent} macro.
+%
+% \begin{syntax}
+% |\soulaccent{|\<accent command>|}|
+% \end{syntax}
+%
+% The standard accents, however, are already pre-registered:
+% |\`|, |\'|, |\^|, |\"|, |\~|, |\=|, |\.|, |\u|, |\v|, |\H|, |\t|,
+% |\c|, |\d|, |\b|, and |\r|. If used together with the \package{german}
+% package, \soul\ automatically adds the |"| command.
+% Let's assume you have defined |\%| to put some weird accent on
+% the next character. Simply put the following line into your |soul.cfg|
+% file (see section~\ref{sec:config}):
+%
+% \begin{example}
+% |\soulaccent{\%}|
+% \end{example}
+%
+% Note that active characters like the |"| command have already
+% to be \cs{\active} when they are stored or they won't be recognized
+% later. This can be done temporarily, as in |{\catcode\`"\active\soulaccent{"}}|.
+%
+%
+%
+%
+% \subsection{Adding font commands}
+% \label{sec:soulregister}
+%
+% To convince \soul\ not to feed font switching (or other)
+% commands to the analyzer, but rather to execute them immediately,
+% they have to be registered, too. The \describemacro{\soulregister} macro
+% takes the name of a command name and either |0| or |1| for the number
+% of arguments:
+%
+% \begin{syntax}
+% |\soulregister{|\<command name>|}{|\<number of arguments>|}|
+% \end{syntax}
+%
+% If \cs{\bf} and \cs{\emph} weren't already registered, you would
+% write the following into your |soul.cfg| configuration file:
+%
+% \begin{example}
+% |\soulregister{\bf}{0} % {\bf foo}| \\
+% |\soulregister{\emph}{1} % \emph{bar}|\\
+% \end{example}
+%
+%
+% All standard \TeX\ and \LaTeX\ font commands, as well as the
+% \package{yfonts} commands are already pre-registered:
+%
+% \begin{example}
+% |\em, \rm, \bf, \it, \tt, \sc, \sl, \sf, \emph, \textrm,|\\
+% |\textsf, \texttt, \textmd, \textbf, \textup, \textsl,|\\
+% |\textit, \textsc, \textnormal, \rmfamily, \sffamily,|\\
+% |\ttfamily, \mdseries, \upshape, \slshape, \itshape,|\\
+% |\scshape, \normalfont, \tiny, \scriptsize, \footnotesize,|\\
+% |\small, \normalsize, \large, \Large, \LARGE, \huge, \Huge,|\\
+% |\MakeUppercase, \textsuperscript, \footnote,|\\
+% |\textfrak, \textswab, \textgoth, \frakfamily,|\\
+% |\swabfamily, \gothfamily|\\
+% \end{example}
+%
+% You can also register other commands as fonts, so the
+% analyzer won't see them. This may be necessary for some
+% macros that \soul\ refuses to typeset correctly.
+% But note, that \cs{\so} and \cs{\caps} won't put their
+% letter-skips around then.
+%
+%
+%
+%
+%
+%
+% \subsection{Changing the internal font}
+% \label{sec:internalfont}
+%
+% The \soul\ package uses the |ectt1000| font while it analyzes
+% the syllables. This font is used, because it
+% has 256~mono-spaced characters without any kerning.
+% It belongs to \person{J\"org Knappen'\textrm{s}}
+% \caps{EC}-fonts, which should be part of every modern \TeX\ installation.
+% If \TeX\ reports ``\texttt{I can't find file `ectt1000'}'' you don't
+% seem to have this font installed. It is recommended that
+% you install at least the file |ectt1000.tfm| which has less than 1.4\,kB\null.
+% Alternatively, you can let the \soul\ package use the |cmtt10| font that
+% is part of any installation, or some other mono-spaced font:
+%
+% \begin{example}
+% |\font\SOUL@tt=cmtt10|
+% \end{example}
+%
+% Note, however, that \soul\ does only handle characters,
+% for which the internal font has a character with the same
+% character code. As |cmtt10| contains only characters with codes
+% 0 to~127, you can't typeset characters with codes 128 to~255.
+% These 8-bit character codes are used by many fonts with non-ascii
+% glyphs. So the |cmtt10| font will, for example, not work for |T2A|
+% encoded cyrillic characters.
+%
+%
+%
+%
+%
+%
+%
+% \subsection{The configuration file}
+% \label{sec:config}
+%
+% If you want to change the predefined settings or add new features,
+% then create a file named `|soul.cfg|' and put it in a directory, where \TeX\
+% can find it. This configuration file will then be loaded
+% at the end of the |soul.sty| file, so you may redefine
+% any settings or commands therein, select package options and even
+% introduce new ones. But if you intend to give
+% your documents to others, don't forget to give them the
+% required configuration files, too! That's how such a file
+% could look like:
+%
+% \indent
+% \begin{example}
+% |% define macros for logical markup|\\
+% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
+% \\
+% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
+% |\DeclareRobustCommand*\versal[1]{%|\\
+% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
+% |}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |% load the color package and set|\\
+% |% a different highlighting color|\\
+% |\RequirePackage{color}|\\
+% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
+% |\sethlcolor{lightblue}|\\
+% |\endinput|
+% \end{example}
+%
+% You can safely use the |\SOUL@@@| namespace for internal macros---it
+% won't be used by the \soul\ package in the future.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Miscellaneous}
+%
+% \subsection{Using \soul\ with other flavors of \TeX}
+% \label{sec:plain}
+%
+% This documentation describes how to use \soul\ together
+% with \LaTeXe, for which it is optimized. It works, however, with
+% all other flavors of \TeX, too. There are just some minor restrictions
+% for Non-\LaTeX\ use:
+%
+% The \cs{\caps} command doesn't use a database, it is only a dumb
+% definition with fixed values. It switches to \cs{\capsfont}, which---unless
+% defined explicitly like in the following example---won't really change
+% the used font at all. The commands \cs{\capsreset} and \cs{\capssave}
+% do nothing.
+%
+% \begin{example}
+% |\font\capsfont=cmcsc10|\\
+% |\caps{Tschichold}|\\
+% \end{example}
+%
+% None of the commands are made `robust', so they have to be
+% explicitly protected in fragile environments like in \cs{\write}
+% statements.
+% To make use of colored underlines or highlighting you have to
+% use the \package{color} package wrapper from \caps{CTAN}^^A
+% \footnote{\texttt{CTAN:/macros/plain/graphics/\char`\{miniltx.tex,color.tex\char`\}}},
+% instead of the \package{color} package directly:
+%
+% \begin{example}
+% |\input color|\\
+% |\input soul.sty|\\
+% |\hl{highlighted}|\\
+% |\bye|\\
+% \end{example}
+%
+% The \option{capsdefault} package option is mapped to a simple command
+% \describemacro{\capsdefault}.
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Using \soul\ commands for logical markup}
+% \label{sec:markup}
+%
+% It's generally a bad idea to use font style commands like \cs{\textsc}
+% in running text. There should always be some reasoning behind changing
+% the style, such as ``names of persons shall be typeset in a caps-and-small-caps
+% font''. So you declare in your text just that some words are the name of a
+% person, while you define in the preamble or, even better, in a separate
+% style file how to deal with persons:
+%
+% \begin{example}
+% |\newcommand*\person{\textsc}|\\
+% |...|\\
+% |``I think it's a beautiful day to go to the zoo and feed|\\
+% |the ducks. To the lions.'' --~\person{Brian Kantor}|\\
+% \end{example}
+%
+% It's quite simple to use \soul\ commands that way:
+%
+% \begin{example}
+% |\newcommand\comment*{\ul} % or \let\comment=\ul|\\
+% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
+% \end{example}
+%
+% Letterspacing commands like \cs{\so} and \cs{\caps} have to
+% check whether they are followed by white space, in which case
+% they replace that space by \syn{outer space}. Note that \soul\
+% does look through closing braces. Hence you can conveniently bury
+% a \soul\ command within another macro like in the following
+% example. Use any other token to hide following space if necessary,
+% for example the \cs{\null} macro.
+%
+% \begin{example}
+% |\DeclareRobustCommand*\versal[1]{%|\\
+% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
+% |}|\\
+% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
+% \end{example}
+%
+%
+% But what if the \soul\ command is for some reason not the last one
+% in that macro definition and thus cannot look ahead at the following token?
+%
+%
+% \begin{example}
+% |\newcommand*\somsg[1]{\so{#1}\message{#1}}|\\
+% |...|\\
+% |foo \somsg{bar} baz % wrong spacing after `bar'!|\\
+% \end{example}
+%
+% In this case you won't get the following space replaced by \emph{outer space}
+% because when \soul\ tries to look ahead, it only sees the token
+% \cs{\message} and consequently decides that there is no space to replace.
+% You can get around this by explicitly calling the space scanner again.
+%
+% \begin{example}
+% |\newcommand*\somsg[1]{{%|\\
+% | \so{#1}%|\\
+% | \message{bar}%|\\
+% | \let\\\SOUL@socheck|\\
+% | \\%|\\
+% |}}|\\
+% \end{example}
+%
+% However, \cs{\SOUL@socheck} can't be used directly, because it would discard
+% any normal space. \cs{\\} doesn't have this problem.
+% The additional pair of braces avoids that its definition leaks out
+% of this macro. In the example above you could, of course, simply
+% have put \cs{\message} in front, so you hadn't needed to
+% use the scanner macro \cs{\SOUL@socheck} at all.
+%
+% Many packages do already offer logical markup commands that default
+% to some standard \LaTeX\ font commands or to \cs{\relax}. One example
+% is the \package{jurabib} package~\cite{jurabib}, which makes the use of
+% \soul\ a challenge. This package implements lots of
+% formatting macros. Let's have a look at one of them, \cs{\jbauthorfont},
+% which is used to typeset author names in citations.
+% The attempt to simply
+% define |\let\jbauthorfont\caps| fails, because the macro isn't directly
+% applied to the author name as in |\jbauthorfont{Don Knuth}|, but
+% to another command sequence: |\jbauthorfont{\jb@@author}|. Not even
+% \cs{\jb@@author} contains the name, but instead further commands that
+% at last yield the requested name. That's why we have to expand
+% the contents first. This is quite tricky, because we must not
+% expand too much, either. Fortunately, we can offer the contents
+% wrapped up in yet another macro, so that \soul\ knows that it has to
+% use its own macro expansion mechanism:
+%
+% \begin{example}
+% |\renewcommand*\jbauthorfont[1]{{%|\\
+% | \def\x{#1}%|\\
+% | \caps\x|\\
+% |}}|\\
+% \end{example}
+%
+% Some additional kerning after |\caps\x| wouldn't hurt, because
+% the look-ahead scanner is blinded by further commands that follow
+% in the \package{jurabib} package. Now we run into the next problem:
+% cited names may contain commands
+% that must not get expanded. We have to register them as special
+% command:
+%
+% \begin{example}
+% |\soulregister\jbbtasep{0}|\\
+% |...|\\
+% \end{example}
+%
+% But such registered commands bypass \soul's kernel and we don't
+% get the correct spacing before and afterwards. So we end up
+% redefining \cs{\jbbtasep}, whereby you should, of course, use
+% variables instead of numbers:
+%
+% \begin{example}
+% |\renewcommand*\jbbtasep{%|\\
+% | \kern.06em|\\
+% | \slash|\\
+% | \hskip.06em|\\
+% | \allowbreak|\\
+% |}|\\
+% \end{example}
+%
+% Another problem arises: bibliography entries that must not get
+% teared apart are supposed to be enclosed in additional braces.
+% This, however, won't work with \soul\ because of
+% \ref{par:Grouping hyphenatable material}. A simple trick will
+% get you around that problem: define a dummy command that only
+% outputs its argument, and register that command:
+%
+% \begin{example}
+% |\newcommand*\together[1]{#1}|\\
+% |\soulregister\together{1}|\\
+% \end{example}
+%
+% Now you can write ``|Author = {\together{Don Knuth}}|'' and
+% \package{jurabib} won't dare to reorder the parts of the name.
+% And what if some name shouldn't get letterspaced at all? Overriding
+% a conventional font style like \cs{\textbf} that was globally
+% set is trivial, you just have to specify the style that you
+% prefer in that very bibliography entry. In our example, if we
+% wanted to keep \soul\ from letterspacing a particular entry,
+% although they are all formatted by our \cs{\jbauthorfont}
+% and hence fed to \cs{\caps}, we'd use the following construction:
+%
+% \begin{example}
+% |Author = {\soulomit{\normalfont\huge Donald E. Knuth}}|\\
+% \end{example}
+%
+% The \package{jurabib} package is probably one of the more
+% demanding packages to collaborate with \soul. Everything else
+% can just become easier.
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Typesetting long words in narrow columns}
+% \label{sec:sloppyword}
+%
+% Narrow columns are best set |flushleft|, because not even the best
+% hyphenation algorithm can guarantee acceptable line breaks without
+% overly stretched spaces.
+% However, in some rare cases one may be \emph{forced} to typeset
+% block aligned. When typesetting in languages like German, where
+% there are really long words, the \describemacro{\sloppyword} macro
+% might help a little bit. It adds enough stretchability between the
+% single characters to make the hyphenation algorithm happy, but
+% is still not as ugly as the example in section~\ref{sec:dirtytricks}
+% demonstrates. In the following example the left column was typeset
+% as ``|Die \sloppyword{Donau...novelle} wird ...|'':
+%
+% \begin{center}
+% \def\word{Do\-nau\-dampf\-schiff\-fahrts\-ge\-sell\-schafts\-^^A
+% ka\-pi\-t\"ans\-wit\-wen\-pen\-si\-ons\-ge\-setz\-no\-vel\-le}
+% \begin{minipage}{1.5in}
+% \plainsetup
+% Die
+% \expandafter\sloppyword\expandafter{\word}
+% wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
+% \end{minipage}
+% \hspace{1em}
+% \batchmode
+% \begin{minipage}{1.5in}
+% \plainsetup
+% Die \word\ wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
+% \end{minipage}
+% \errorstopmode
+% \end{center}
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Using \soul\ commands in section headings}
+%
+% Letterspacing was often used for section titles in the past,
+% mostly centered and with a closing period. The following example
+% shows how to achieve this using the \package{titlesec}
+% package \cite{titlesec}:
+%
+% \begin{example}
+% |\newcommand*\periodafter[2]{#1{#2}.}|\\
+% |\titleformat{\section}[block]|\\
+% | {\normalfont\centering}|\\
+% | {\thesection.}|\\
+% | {.66em}|\\
+% | {\periodafter\so}|\\
+% |...|\\
+% |\section{Von den Maassen und Maassst\"aben}|\\
+% \end{example}
+%
+% \bigbreak
+% This yields the following output:
+%
+% \bigskip
+% \newbox\examplebox
+% \sbox\examplebox{
+% \begin{minipage}{.9\textwidth}
+% \small
+% \bigskip
+% \begin{center}
+% \so{1\<. Von den Maassen und Maassst\"aben}.
+% \bigskip
+% \end{center}
+% \end{minipage}}
+% \fbox{\usebox\examplebox}
+% \bigbreak
+%
+% \noindent
+% The \cs{\periodafter} macro adds a period to the title, but not to
+% the entry in the table of contents. It takes the name of a command as
+% argument, that shall be applied to the title, for example~\cs{\so}.
+% Here's a more complicated and complete example:
+%
+% \begin{example}
+% |\documentclass{article}|\\
+% |\usepackage[latin1]{inputenc}|\\
+% |\usepackage[T1]{fontenc}|\\
+% |\usepackage{german,soul}|\\
+% |\usepackage[indentfirst]{titlesec}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\newcommand*\sectitle[1]{%|\\
+% | \MakeUppercase{\so{#1}.}\\[.66ex]|\\
+% | \rule{13mm}{.4pt}}|\\
+% |\newcommand*\periodafter[2]{#1{#2.}}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\titleformat{\section}[display]|\\
+% | {\normalfont\centering}|\\
+% | {\S. \thesection.}|\\
+% | {2ex}|\\
+% | {\sectitle}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\titleformat{\subsection}[block]|\\
+% | {\normalfont\centering\bfseries}|\\
+% | {\thesection.}|\\
+% | {.66em}|\\
+% | {\periodafter\relax}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\begin{document}|\\
+% |\section{Von den Maassen und Maassst\"aben}|\\
+% |\subsection{Das L\"angenmaass im Allgemeinen}|\\
+% \\
+% |Um L\"angen genau messen und vergleichen zu k\"onnen,|\\
+% |bedarf es einer gewissen, bestimmten Einheit, mit der|\\
+% |man untersucht, wie oft sie selbst, oder ihre Theile,|\\
+% |in der zu bestimmenden L\"ange enthalten sind.|\\
+% |...|\\
+% |\end{document}|
+% \end{example}
+%
+% \bigbreak
+% This example gives you roughly the following output,
+% which is a facsimile from~\cite{Muszynski}.
+%
+% \bigskip
+% \sbox\examplebox{
+% \begin{minipage}{.9\textwidth}
+% \small
+% \bigskip
+% \begin{center}
+% \S. 1.\\[2ex]
+% \so{VON DEN MAASSEN UND MAASSST\"ABEN}.\\[.66ex]
+% \rule{12mm}{.4pt}\\[1.66ex]
+% \textbf{1. Das L\"angenmaass im Allgemeinen.}\\[.66em]
+% \end{center}
+% \leavevmode\qquad
+% Um L\"angen genau messen und vergleichen zu k\"onnen,
+% bedarf es einer gewissen, bestimmten Einheit, mit der
+% man untersucht, wie oft sie selbst, oder ihre Theile,
+% in der zu bestimmenden L\"ange enthalten sind.
+% \bigskip
+% \end{minipage}}
+% \fbox{\usebox\examplebox}
+% \bigbreak
+%
+% \noindent
+% Note that the definition of \cs{\periodafter} decides if
+% the closing period shall be spaced out with the title (1), or
+% follow without space (2):
+%
+% \begin{example}
+% 1.\qquad|\newcommand*\periodafter[2]{#1{#2.}}|\\
+% 2.\qquad|\newcommand*\periodafter[2]{#1{#2}.}|\\
+% \end{example}
+%
+%
+%
+% \noindent
+% If you need to underline section titles, you can easily
+% do it with the help of the \package{titlesec} package. The following
+% example underlines the section title, but not the section
+% number:
+%
+% \begin{example}
+% |\titleformat{\section}|\\
+% | {\LARGE\titlefont}|\\
+% | {\thesection}|\\
+% | {.66em}|\\
+% | {\ul}|\\
+% \end{example}
+%
+% \noindent
+% The \cs{\titlefont} command is provided by the \caps{``\small{KOMA}}~script''
+% package. You can write |\normalfont\sffamily\bfseries| instead.
+% The following example does additionally underline the section number:
+%
+% \begin{example}
+% |\titleformat{\section}|\\
+% | {\LARGE\titlefont}|\\
+% | {\ul{\thesection{\kern.66em}}}|\\
+% | {0pt}|\\
+% | {\ul}|\\
+% \end{example}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{How the package works}
+%
+% \subsection{The kernel}
+% \so{Letterspacing,} \ul{underlining}, \st{striking out} and highlighting
+% use the same kernel. It lets a \emph{word scanner} run over the given argument,
+% which inspects every token. If a token is a command registered via \cs{\soulregister},
+% it is executed immediately. Other tokens are only counted and trigger some action
+% when a certain number is reached (quotes and dashes). Three subsequent `|-|', for example,
+% trigger |\SOUL@everyexhyphen{---}|. A third group leads to special actions,
+% like |\mbox| that starts reading-in a whole group to protect its contents and let them be
+% seen as one entity. All other tokens, mostly characters and digits, are collected in
+% a word register, which is passed to the analyzer, whenever a whole word was read in.
+%
+% The analyzer typesets the word in a 1\,sp ($=\frac1{65536}$\,pt) wide \cs{\vbox},
+% hence encouraging \TeX\ to break lines at every possible hyphenation point. It
+% uses the mono-spaced \cs{\SOUL@tt} font (|ectt1000|), so as to avoid any inter-character
+% kerning. Now the \cs{\vbox} is decomposed splitting off \cs{\hbox} after \cs{\hbox}
+% from the bottom. All boxes, each of which contains one syllable, are pushed onto a
+% stack, which is provided by \TeX's grouping mechanism. When returning from the
+% recursion, box after box is fetched from the stack, its width measured and fed to the
+%``reconstructor''.
+%
+% This reconstruction macro (\cs{\SOUL@dosyllable}) starts to read tokens
+% from the just analyzed word until the given syllable
+% width is obtained. This is repeated for each syllable. Every time the engine
+% reaches a relevant state, the corresponding driver macro is executed
+% and, if necessary, provided with some data. There is a macro that is
+% executed for each token, one for each syllable, one for each space etc\null.
+%
+% The engine itself doesn't know how to letterspace or to underline. It
+% just tells the selected driver about the structure of the given argument.
+% There's a default driver (\cs{\SOUL@setup}) that does only set the
+% interface macros to a reasonable default state, but doesn't really do anything.
+% Further drivers can safely inherit these settings and only need to
+% redefine what they want to change.
+%
+%
+%
+%
+%
+% \subsection{The interface}
+% \label{sec:interface}
+%
+% \subsubsection{The registers}
+%
+% The package offers eight interface macros that can be used to define
+% the required actions. Some of the macros receive data as macro parameter
+% or in special \emph{token} or \emph{dimen} registers. Here is a list of
+% all available registers:
+%
+% \begin{labeling}{\hspace{.36\hsize}}
+% \item[\texttt{\string\SOUL@token}]
+% This token register contains the current token. It has to be used as |\the\SOUL@token|.
+% The macro \cs{\SOUL@gettoken} reads the next token into \cs{\SOUL@token} and
+% can be used in any interface macro. If you don't want to lose the old meaning,
+% you have to save it explicitly. \cs{\SOUL@puttoken} pushes the token
+% back into the queue, without changing \cs{\SOUL@token}. You can only
+% put one token back, otherwise you get an error message.
+% \item[\texttt{\string\SOUL@lasttoken}]
+% This token register contains the last token.
+% \item[\texttt{\string\SOUL@syllable}]
+% This token register contains all tokens that were already collected for
+% the current syllable. When used in \cs{\SOUL@everysyllable}, it
+% contains the \emph{whole} syllable.
+% \item[\texttt{\string\SOUL@charkern}]
+% This dimen register contains the kerning value between the current and the next character.
+% Since most character pairs don't require a kerning value to be applied and the
+% output in the logfile shouldn't be cluttered with |\kern0pt| it is
+% recommended to write |\SOUL@setkern\SOUL@charkern|, which sets
+% kerning for non-zero values only.
+% \item[\texttt{\string\SOUL@hyphkern}]
+% This dimen register contains the kerning value between the current character
+% and the hyphen character or, when used in \cs{\SOUL@everyexhyphen}, the
+% kerning between the last character and the explicit hyphen.
+% \end{labeling}
+%
+%
+%
+%
+%
+%
+% \subsubsection{The interface macros}
+%
+% The following list describes each of the interface macros and which
+% registers it can rely on. The mark between label and description
+% will be used in section \ref{sec:interfaceexamples} to show when
+% the macros are executed. The addition |#1| means that the macro
+% takes one argument.
+%
+% \begin{labeling}{\hspace{.36\hsize}}
+% \def\m#1{\leavevmode\llap{\hbox to1em{\hss#1\hss}\hskip.7em}}
+% \item[\texttt{\string\SOUL@preamble}]\m{$P$}^^A
+% executed once at the beginning
+% \item[\texttt{\string\SOUL@postamble}]\m{$E$}^^A
+% executed once at the end
+% \item[\texttt{\string\SOUL@everytoken}]\m{$T$}^^A
+% executed after scanning a token; It gets that
+% token in \cs{\SOUL@token} and has to care for inserting
+% the kerning value \cs{\SOUL@charkern} between this and the next character.
+% To look at the next character, execute \cs{\SOUL@gettoken}, which
+% replaces \cs{\SOUL@token} by the next token. This token has to
+% be put back into the queue using \cs{\SOUL@puttoken}.
+% \item[\texttt{\string\SOUL@everysyllable}]\m{$S$}^^A
+% This macro is executed after scanning a whole syllable. It gets the
+% syllable in \cs{\SOUL@syllable}.
+% \item[\texttt{\string\SOUL@everyhyphen}]\m{$-$}^^A
+% This macro is executed at every implicit hyphenation point.
+% It is responsible for setting the hyphen and will likely do this
+% in a \cs{\discretionary} statement. It has to care about the
+% kerning values. The registers \cs{\SOUL@lasttoken}, \cs{\SOUL@syllable},
+% \cs{\SOUL@charkern} and \cs{\SOUL@hyphkern} contain useful information.
+% Note that \cs{\discretionary} inserts \cs{\exhyphenpenalty}
+% if the first part of the discretionary is empty, and
+% \cs{\hyphenpenalty} else.
+% \item[\texttt{\string\SOUL@everyexhyphen\#1}]\m{$=$}^^A
+% This macro is executed at every explicit hyphenation point. The
+% hyphen `character' (one of hyphen, en-dash, em-dash or \cs{\slash})
+% is passed as parameter |#1|. A minimal implementation
+% would be |{#1\penalty\exhyphenpenalty}|. The kerning value
+% between the last character and the hyphen is passed in \cs{\SOUL@hyphkern},
+% that between the hyphen and the next character in \cs{\SOUL@charkern}.
+% The last syllable can be found in \cs{\SOUL@syllable}, the last
+% character in \cs{\SOUL@lasttoken}.
+% \item[\texttt{\string\SOUL@everyspace\#1}]\m{\texttt{\char`\ }}^^A
+% This macro is executed between every two words. It is responsible for
+% setting the space. The engine submits a \cs{\penalty} setting as
+% parameter |#1| that should be put in front of the space. The
+% macro should at least do |{#1\space}|. Further information can be found in
+% \cs{\SOUL@lasttoken} and \cs{\SOUL@syllable}. Note that this macro does not
+% care for the leading and trailing space. This is the job of
+% \cs{\SOUL@preamble} and \cs{\SOUL@postamble}.
+% \end{labeling}
+%
+%
+%
+%
+%
+%
+% \subsubsection{Some examples}
+% \label{sec:interfaceexamples}
+%
+% The above list's middle column shows a mark that indicates in the
+% following examples, when the respective macros are executed:\nopagebreak
+%
+% \begin{labeling}{\hspace{.36\hsize}}
+% \item[\normalfont\an{word}]
+% \cs{\SOUL@everytoken}$^T$ is executed for every token. \cs{\SOUL@everysyllable}$^S$
+% is \emph{additionally} executed for every syllable. You will mostly just
+% want to use either of them.
+% \item[\normalfont\an{one two}]
+% The macro |\SOUL@everyspace| is executed at every space within
+% the \soul\ argument. It has to take one argument, that can either
+% be empty or contain a penalty, that should be applied to the space.
+% \item[\normalfont\an{example}\kern-1em]
+% The macro |\SOUL@everyhyphen| is executed at every possible
+% implicit hyphenation point.
+% \item[\normalfont\an{beta-test}]
+% Explicit hyphens trigger \cs{\SOUL@everyexhyphen}.
+% \end{labeling}
+%
+%
+%
+% \bigbreak
+% \noindent
+% It's only natural that these examples, too,
+% were automatically typeset by the |soul| package
+% using a special driver:
+%
+% \begin{example}
+% |\DeclareRobustCommand*\an{%|\\
+% | \def\SOUL@preamble{$^{^P}$}%|\\
+% | \def\SOUL@everyspace##1{##1\texttt{\char`\ }}%|\\
+% | \def\SOUL@postamble{$^{^E}$}%|\\
+% | \def\SOUL@everyhyphen{$^{^-}$}%|\\
+% | \def\SOUL@everyexhyphen##1{##1$^{^=}$}%|\\
+% | \def\SOUL@everysyllable{$^{^S}$}%|\\
+% | \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}%|\\
+% | \def\SOUL@everylowerthan{$^{^L}$}%|\\
+% | \SOUL@}|\\
+% \end{example}
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{A driver example}
+%
+% Let's define a \soul\ driver that allows to typeset text
+% with a \cs{\cdot} at every potential hyphenation point. The name of
+% the macro shall be \cs{\sy} (for \emph{syllables}).
+% Since the \soul\ mechanism is highly fragile, we use the \LaTeX\
+% command \cs{\DeclareRobustCommand}, so that the \cs{\sy} macro
+% can be used even in section headings etc. The \cs{\SOUL@setup}
+% macro sets all interface macros to reasonable default definitions.
+% This could of course be done manually, too. As we won't
+% make use of \cs{\SOUL@everytoken} and \cs{\SOUL@postamble}
+% and both default to \cs{\relax}, anyway, we don't have to
+% define them here.
+%
+% \begin{example}
+% |\DeclareRobustCommand*\sy{%|\\
+% | \SOUL@setup|\\
+% \end{example}
+%
+% We only set \cs{\lefthyphenmin} and \cs{\righthyphenmin} to zero
+% at the beginning. All changes are restored automatically,
+% so there's nothing to do at the end.
+%
+% \begin{example}
+% | \def\SOUL@preamble{\lefthyphenmin=0 \righthyphenmin=0 }%|\\
+% \end{example}
+%
+% We only want simple spaces. Note that these are not provided
+% by default! \cs{\SOUL@everyspace} may get a penalty to be
+% applied to that space, so we set it before.
+%
+% \begin{example}
+% | \def\SOUL@everyspace##1{##1\space}%|\\
+% \end{example}
+%
+% There's nothing to do for \cs{\SOUL@everytoken}, we rather let
+% \cs{\SOUL@everysyllable} handle a whole syllable at once.
+% This has the advantage, that we don't have to deal with
+% kerning values, because \TeX\ takes care of that.
+%
+% \begin{example}
+% | \def\SOUL@everysyllable{\the\SOUL@syllable}%|\\
+% \end{example}
+%
+% The \TeX\ primitive \cs{\discretionary}
+% takes three arguments: 1.~pre-hyphen material
+% 2.~post-hyphen material, and 3.~no-hyphenation material.
+%
+% \begin{example}
+% | \def\SOUL@everyhyphen{%|\\
+% | \discretionary{%|\\
+% | \SOUL@setkern\SOUL@hyphkern|\\
+% | \SOUL@sethyphenchar|\\
+% | }{}{%|\\
+% | \hbox{\kern1pt$\cdot$}%|\\
+% | }%|\\
+% | }%|\\
+%\end{example}
+%
+% Explicit hyphens like dashes and slashes shall be set normally.
+% We just have to care for kerning. The hyphen has to be put in
+% a box, because, as \cs{\hyphenchar}, it would yield its own, internal
+% \cs{\discretionary}. We need to set ours instead, though.
+%
+% \begin{example}
+% | \def\SOUL@everyexhyphen##1{%|\\
+% | \SOUL@setkern\SOUL@hyphkern|\\
+% | \hbox{##1}%|\\
+% | \discretionary{}{}{%|\\
+% | \SOUL@setkern\SOUL@charkern|\\
+% | }%|\\
+% | }%|\\
+% \end{example}
+%
+% Now that the interface macros are defined, we can start the scanner.
+%
+% \begin{example}
+% | \SOUL@|\\
+% |}|\\
+% \end{example}
+%
+% \hyphenation{al-go-rithm lin-guists ex-cel-lent} ^^A correct?
+% \noindent
+% \emph{\sy{This little macro will hardly be good enough
+% for linguists, although it uses {\TeX's} excellent hyphenation algorithm,
+% but it is at least a nice alternative to the}} \cs{\showhyphens} \emph{\sy{command}.}
+%
+%
+%
+%
+%
+%
+%
+% \section*{Acknowledgements}
+%
+% A big thank you goes to \person{Stefan Ulrich} for his tips and bug reports
+% during the development of versions 1.\lower2pt\hbox{*} and for his lessons on high quality
+% typesetting. The \cs{\caps} mechanism was very much influenced by his
+% suggestions. Thanks to \person{Alexander Shibakov} and \person{Frank Mittelbach,}
+% who sent me a couple of bug reports and feature requests, and finally encouraged
+% me to (almost) completely rewrite \soul. \person{Thorsten Manegold} contributed
+% a series of bug reports, helping to fix \soul's macro expander and hence making
+% it work together with the \package{jurabib} package.
+% Thanks to \person{Axel Reichert, Anshuman Pandey,} and \person{Peter Kreynin} for
+% detailed bug reports.
+% \person{Rowland McDonnel} gave useful hints for how to improve the documentation,
+% but I'm afraid he will still not be satisfied, and rightfully so. If only documentation
+% writing weren't that boring.~~\texttt{;-)}
+%
+%
+%
+%
+%
+%
+%
+% \begin{thebibliography}{00}
+% \raggedright
+%
+% \bibitem{jurabib}{\person{Berger, Jens:} \bibtitle{The jurabib package.} \CTAN-Archive, 2002, v0.52h.}
+%
+% \bibitem{titlesec}{\person{Bezos, Javier:} \bibtitle{The titlesec and titletoc package.}
+% \CTAN-Archive, 1999, v2.1.}
+%
+% \bibitem{color}{\person{Carlisle, D. P.:} \bibtitle{The color package.} \CTAN-Archive, 1997, v1.0d.}
+%
+% \bibitem{Duden}{Duden, Volume 1. \bibtitle{Die Rechtschreibung.} Bibliographisches Institut,
+% Mann\-heim--\hskip0pt Wien--Z\"urich, 1986, 19th~edition.}
+%
+% \bibitem{DEK}{\person{Knuth, Donald E.:} \bibtitle{The \TeX book.}
+% Addison--Wesley Publishing Company, Reading/Massachusetts, 1989, 16th~edition.}
+%
+% \bibitem{Muszynski}{\person{Muszynski, Carl} and \person{P\v rihoda, Eduard:}
+% \bibtitle{Die Terrainlehre in Verbindung mit der Darstellung, Beurtheilung und
+% Beschreibung des Terrains vom milit\"arischen
+% Standpunkte.}
+% L.\,W.~Seidel \&\ Sohn, Wien, 1872.}
+%
+% \bibitem{Reglement}{Normalverordnungsblatt f\"ur das k.\,u.\,k.~Heer.
+% \bibtitle{Exercier-Reglement f\"ur die k.\,u.\,k.~Cavallerie, I. Theil.}
+% Wien, k.\,k.~Hof- und Staatsdruckerei, 1898, 4th~edition.}
+%
+% \bibitem{german}{\person{Raichle, Bernd:} \bibtitle{The german package.} \CTAN-Archive, 1998, v2.5e.}
+%
+% \bibitem{yfonts}{\person{Schmidt, Walter:} \bibtitle{Ein Makropaket f\"ur die gebrochenen
+% Schriften.} \CTAN-Archive, 1998, v1.2.}
+%
+% \bibitem{Tschichold}{\person{Tschichold, Jan:} \bibtitle{Ausgew\"ahlte Aufs\"atze \"uber Fragen
+% der Gestalt des Buches und der Typographie.} Birkh\"auser, Basel,
+% 1987, 2nd~edition.}
+%
+% \bibitem{Willberg}{\person{Willberg, Hans Peter} and \person{Forssmann, Friedrich:}
+% \bibtitle{Lesetypographie.} H. Schmidt, Mainz, 1997.}
+%
+% \end{thebibliography}
+%
+%
+% \StopEventually{\addtocontents{toc}{\protect\end{multicols}}}
+%
+%
+%
+%
+%
+%
+%
+%
+%^^A max 72 columns
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \section{The implementation}
+%
+% \subsection*{The package preamble}
+%
+% This piece of code makes sure that the package is only loaded
+% once. While this is guaranteed by \LaTeX, we have to do it
+% manually for all other flavors of \TeX.
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macrocode}
+\expandafter\ifx\csname SOUL@\endcsname\relax\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% Fake some of the \LaTeX\ commands if we were loaded by another flavor
+% of \TeX. This might break some previously loaded packages, though,
+% if e.\,g.~\cs{\mbox} was already in use. But we don't care \dots
+%
+% \begin{macrocode}
+\ifx\documentclass\SOULundefined
+ \chardef\atcode=\catcode`@
+ \catcode`\@=11
+ \def\DeclareRobustCommand*{\def}
+ \let\newcommand\DeclareRobustCommand
+ \def\DeclareOption#1#2{\expandafter\def\csname#1\endcsname{#2}}
+ \def\PackageError#1#2#3{{%
+ \newlinechar`^^J%
+ \errorcontextlines\z@
+ \edef\\{\errhelp{#3}}\\%
+ \errmessage{Package #1 error: #2}%
+ }}
+ \def\@height{height}
+ \def\@depth{depth}
+ \def\@width{width}
+ \def\@plus{plus}
+ \def\@minus{minus}
+ \font\SOUL@tt=ectt1000
+ \let\@xobeysp\space
+ \let\linebreak\break
+ \let\mbox\hbox
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% \soul\ tries to be a good \LaTeX\ citizen if used under \LaTeX\ and
+% declares itself properly. Most command sequences in the package
+% are protected by the |SOUL@| namespace, all other macros are first
+% defined to be empty. This will give us an error message \emph{now}
+% if one of those was already used by another package.
+%
+% \begin{macrocode}
+\else
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesPackage{soul-ori}
+ [2023-02-18 v3.0 letterspacing/underlining (mf)]
+ \newfont\SOUL@tt{ectt1000}
+ \newcommand*\sodef{}
+ \newcommand*\resetso{}
+ \newcommand*\capsdef{}
+ \newcommand*\capsfont{}
+ \newcommand*\setulcolor{}
+ \newcommand*\setuloverlap{}
+ \newcommand*\setul{}
+ \newcommand*\resetul{}
+ \newcommand*\setuldepth{}
+ \newcommand*\setstcolor{}
+ \newcommand*\sethlcolor{}
+ \newcommand*\so{}
+ \newcommand*\ul{}
+ \newcommand*\st{}
+ \newcommand*\hl{}
+ \newcommand*\caps{}
+ \newcommand*\soulaccent{}
+ \newcommand*\soulregister{}
+ \newcommand*\soulfont{}
+ \newcommand*\soulomit{}
+\fi
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% Other packages wouldn't be happy if we reserved piles of \cs{\newtoks} and
+% \cs{\newdimen}, so we try to get away with their \cs{\...def} counterparts
+% where possible.
+% Local registers are always even, while global ones are odd---this is a
+% \TeX\ convention.
+%
+% \begin{macrocode}
+\newtoks\SOUL@word
+\newtoks\SOUL@lasttoken
+\newtoks\SOUL@syllable
+\newtoks\SOUL@cmds
+\newtoks\SOUL@buffer
+\newtoks\SOUL@token
+\newdimen\SOUL@syllgoal
+\newdimen\SOUL@syllwidth
+\newdimen\SOUL@charkern
+\newdimen\SOUL@hyphkern
+\newdimen\SOUL@dimen
+\newdimen\SOUL@dimeni
+\newcount\SOUL@minus
+\newcount\SOUL@comma
+\newcount\SOUL@apo
+\newcount\SOUL@grave
+\newskip\SOUL@spaceskip
+\newif\ifSOUL@ignorespaces
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% ^^A\FIXME{\newpage}
+% \begin{macro}{\soulomit}
+% \begin{macro}{\SOUL@ignorem}
+% \begin{macro}{\SOUL@ignore}
+% \begin{macro}{\SOUL@stopm}
+% \begin{macro}{\SOUL@stop}
+% \begin{macro}{\SOUL@relaxm}
+% \begin{macro}{\SOUL@lowerthanm}
+% \begin{macro}{\SOUL@hyphenhintm}
+% These macros are used as markers. To be able to check for such a
+% marker with \cs{\ifx} we have also to create a macro that contains
+% the marker. \cs{\SOUL@spc} shall contain a normal space with a
+% \cs{\catcode} of~10.
+%
+% \begin{macrocode}
+\def\soulomit#1{#1}
+\def\SOUL@stopM{\SOUL@stop}
+\let\SOUL@stop\relax
+\def\SOUL@lowerthan{}
+\def\SOUL@lowerthanM{\<}
+\def\SOUL@hyphenhintM{\-}
+\def\SOUL@n*{\let\SOUL@spc= }\SOUL@n* %
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The kernel}
+%
+% \begin{macro}{\SOUL@}
+% This macro is the entry to \soul. Using it does only make
+% sense after setting up a \soul\ driver. The next token after
+% the \soul\ command will be assigned to \cs{\SOUL@@}. This can be
+% some text enclosed in braces, or the name of a macro that contains text.
+%
+% \begin{macrocode}
+\def\SOUL@{%
+ \futurelet\SOUL@@\SOUL@expand
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@expand}
+% If the first token after the \soul\ command was an opening
+% brace we start scanning. Otherwise,
+% if the first token was a macro name, we expand that macro and
+% call \cs{\SOUL@} with its contents again. Unfortunately, we have to
+% exclude some macros therein from expansion.
+%
+% \begin{macrocode}
+\def\SOUL@expand{%
+ \ifcat\bgroup\noexpand\SOUL@@
+ \let\SOUL@n\SOUL@start
+ \else
+ \bgroup
+ \def\\##1##2{\def##2{\noexpand##2}}%
+ \the\SOUL@cmds
+ \SOUL@buffer={%
+ \\\TeX\\\LaTeX\\\soulomit\\\mbox\\\hbox\\\textregistered
+ \\\slash\\\textcircled\\\copyright\\\S\\\,\\\<\\\>\\~%
+ \\\\%
+ }%
+ \def\\##1{\def##1{\noexpand##1}}%
+ \the\SOUL@buffer
+ \let\protect\noexpand
+ \xdef\SOUL@n##1{\noexpand\SOUL@start{\SOUL@@}}%
+ \egroup
+ \fi
+ \SOUL@n
+}
+\long\def\SOUL@start#1{{%
+ \let\<\SOUL@lowerthan
+ \let\>\empty
+ \def\soulomit{\noexpand\soulomit}%
+ \gdef\SOUL@eventuallyexhyphen##1{}%
+ \let\SOUL@soeventuallyskip\relax
+ \SOUL@spaceskip=\fontdimen\tw@\font\@plus\fontdimen\thr@@\font
+ \@minus\fontdimen4\font
+ \SOUL@ignorespacesfalse
+ \leavevmode
+ \SOUL@preamble
+ \SOUL@lasttoken={}%
+ \SOUL@word={}%
+ \SOUL@minus\z@
+ \SOUL@comma\z@
+ \SOUL@apo\z@
+ \SOUL@grave\z@
+ \SOUL@do{#1}%
+ \SOUL@postamble
+}}
+\long\def\SOUL@do#1{%
+ \SOUL@scan#1\SOUL@stop
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The scanner}
+%
+% \begin{macro}{\SOUL@scan}
+% This is the entry point for the scanner. It calls \cs{\SOUL@eval}
+% and will in turn be called by \cs{\SOUL@eval} again for every
+% new token to be scanned.
+%
+% \begin{macrocode}
+\def\SOUL@scan{%
+ \futurelet\SOUL@@\SOUL@eval
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@eval}
+% And here it is: the scanner's heart. It cares for quotes and dashes
+% ligatures and handles all commands that must not be fed to the
+% analyzer.
+%
+% \begin{macrocode}
+\def\SOUL@eval{%
+ \def\SOUL@n*##1{\SOUL@scan}%
+ \if\noexpand\SOUL@@\SOUL@spc
+ \else
+ \SOUL@ignorespacesfalse
+ \fi
+ \ifnum\SOUL@minus=\thr@@
+ \SOUL@flushminus
+ \else\ifnum\SOUL@comma=\tw@
+ \SOUL@flushcomma
+ \else\ifnum\SOUL@apo=\tw@
+ \SOUL@flushapo
+ \else\ifnum\SOUL@grave=\tw@
+ \SOUL@flushgrave
+ \fi\fi\fi\fi
+ \ifx\SOUL@@-\else\SOUL@flushminus\fi
+ \ifx\SOUL@@,\else\SOUL@flushcomma\fi
+ \ifx\SOUL@@'\else\SOUL@flushapo\fi
+ \ifx\SOUL@@`\else\SOUL@flushgrave\fi
+ \ifx\SOUL@@-%
+ \advance\SOUL@minus\@ne
+ \else\ifx\SOUL@@,%
+ \advance\SOUL@comma\@ne
+ \else\ifx\SOUL@@'%
+ \advance\SOUL@apo\@ne
+ \else\ifx\SOUL@@`%
+ \advance\SOUL@grave\@ne
+ \else
+ \SOUL@flushminus
+ \SOUL@flushcomma
+ \SOUL@flushapo
+ \SOUL@flushgrave
+ \ifx\SOUL@@\SOUL@stop
+ \def\SOUL@n*{%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ }%
+ \else\ifx\SOUL@@\par
+ \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
+ \else\if\noexpand\SOUL@@\SOUL@spc
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \ifSOUL@ignorespaces
+ \else
+ \SOUL@everyspace{}%
+ \fi
+ \def\SOUL@n* {\SOUL@scan}%
+ \else\ifx\SOUL@@\\%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\unskip\nobreak\hfil\break}%
+ \SOUL@ignorespacestrue
+ \else\ifx\SOUL@@~%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \else\ifx\SOUL@@\slash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{/}%
+ \SOUL@exhyphen{/}%
+ \else\ifx\SOUL@@\mbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\hbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\soulomit
+ \def\SOUL@n*\soulomit##1{%
+ \SOUL@doword
+ {\spaceskip\SOUL@spaceskip##1}%
+ \SOUL@scan
+ }%
+ \else\ifx\SOUL@@\break
+ \SOUL@doword
+ \break
+ \else\ifx\SOUL@@\linebreak
+ \SOUL@doword
+ \SOUL@everyspace{\linebreak}%
+ \else\ifcat\bgroup\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addgroup{}}%
+ \else\ifcat$\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addmath}%
+ \else
+ \def\SOUL@n*{\SOUL@dotoken}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi
+ \SOUL@n*%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@flushminus}
+% \begin{macro}{\SOUL@flushcomma}
+% \begin{macro}{\SOUL@flushapo}
+% \begin{macro}{\SOUL@flushgrave}
+% As their names imply, these macros flush special tokens or token
+% groups to the word register. They don't do anything if the respective
+% counter equals zero. \cs{\SOUL@minus} does also flush the word
+% register, because hyphens disturb the analyzer.
+%
+% \begin{macrocode}
+\def\SOUL@flushminus{%
+ \ifcase\SOUL@minus
+ \else
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{-}%
+ \ifcase\SOUL@minus
+ \or
+ \SOUL@exhyphen{-}%
+ \or
+ \SOUL@exhyphen{--}%
+ \or
+ \SOUL@exhyphen{---}%
+ \fi
+ \SOUL@minus\z@
+ \fi
+}
+\def\SOUL@flushcomma{%
+ \ifcase\SOUL@comma
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word,}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
+ \fi
+ \SOUL@comma\z@
+}
+\def\SOUL@flushapo{%
+ \ifcase\SOUL@apo
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word'}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
+ \fi
+ \SOUL@apo\z@
+}
+\def\SOUL@flushgrave{%
+ \ifcase\SOUL@grave
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word`}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
+ \fi
+ \SOUL@grave\z@
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@dotoken}
+% Command sequences from the \cs{\SOUL@cmds} list are handed over
+% to \cs{\SOUL@docmd}, everything else is added to \cs{\SOUL@word},
+% which will be fed to the analyzer every time a word is completed.
+% Since \emph{robust} commands come with an additional space, we
+% have also to examine if there's a space variant. Otherwise we
+% couldn't detect pre-expanded formerly robust commands.
+%
+% \begin{macrocode}
+\def\SOUL@dotoken#1{%
+ \def\SOUL@@{\SOUL@addtoken{#1}}%
+ \def\\##1##2{%
+ \edef\SOUL@x{\string#1}%
+ \edef\SOUL@n{\string##2}%
+ \ifx\SOUL@x\SOUL@n
+ \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
+ \else
+ \edef\SOUL@n{\string##2\space}%
+ \ifx\SOUL@x\SOUL@n
+ \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
+ \fi
+ \fi
+ }%
+ \the\SOUL@cmds
+ \SOUL@@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@docmd}
+% Here we deal with commands that were registered with \cs{\soulregister}
+% or \cs{\soulaccent} or were already predefined in \cs{\SOUL@cmds}.
+% Commands with identifier |9| are accents that are put in a
+% group with their argument. Identifier |8| is reserved for the \cs{\footnote}
+% command, and |7| for the \cs{\textsuperscript} or similar commands.
+% The others are mostly (but not necessarily)
+% font switching commands, which may (|1|) or may not (|0|) take
+% an argument. A registered command leads to the current word
+% buffer being flushed to the analyzer, after which the command
+% itself is executed.
+%
+% Font switching commands which take an argument need special
+% treatment: They need to increment the level counter, so that
+% \cs{\SOUL@eval} knows where to stop scanning. Furthermore the
+% scanner has to be enabled to see the next token after the opening
+% brace.
+%
+%
+% \begin{macrocode}
+\def\SOUL@docmd#1#2{%
+ \ifx9#1%
+ \def\SOUL@@{\SOUL@addgroup{#2}}%
+ \else\ifx8#1%
+ \SOUL@doword
+ \def\SOUL@@##1{%
+ \SOUL@token={\footnotemark}%
+ \SOUL@everytoken
+ \SOUL@syllable={\footnotemark}%
+ \SOUL@everysyllable
+ \footnotetext{##1}%
+ \SOUL@doword
+ \SOUL@scan
+ }%
+ \else\ifx7#1%
+ \SOUL@doword
+ \def\SOUL@@##1{%
+ \SOUL@token={#2{##1}}%
+ \SOUL@everytoken
+ \SOUL@syllable={#2{##1}}%
+ \SOUL@everysyllable
+ \SOUL@doword
+ \SOUL@scan
+ }%
+ \else\ifx1#1%
+ \SOUL@doword
+ \def\SOUL@@##1{%
+ #2{\protect\SOUL@do{##1}}%
+ \SOUL@scan
+ }%
+ \else
+ \SOUL@doword
+ #2%
+ \let\SOUL@@\SOUL@scan
+ \fi\fi\fi\fi
+ \SOUL@@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@addgroup}
+% \begin{macro}{\SOUL@addmath}
+% \begin{macro}{\SOUL@addprotect}
+% \begin{macro}{\SOUL@addtoken}
+% The macro names say it all. Each of these macros adds some
+% token to the word buffer \cs{\SOUL@word}. Setting \cs{\protect}
+% is necessary to make things like |\so{{a\itshape b}}| work.
+%
+% \begin{macrocode}
+\def\SOUL@addgroup#1#2{%
+ {\let\protect\noexpand
+ \edef\x{\global\SOUL@word={\the\SOUL@word{{\noexpand#1#2}}}}\x}%
+ \SOUL@scan
+}
+\def\SOUL@addmath$#1${%
+ {\let\protect\noexpand
+ \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{$#1$}}}}}\x}%
+ \SOUL@scan
+}
+\def\SOUL@addprotect#1#2{%
+ {\let\protect\noexpand
+ \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{#2}}}}}\x}%
+ \SOUL@scan
+}
+\def\SOUL@addtoken#1{%
+ \edef\x{\SOUL@word={\the\SOUL@word\noexpand#1}}\x
+ \SOUL@scan
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@exhyphen}
+% Dealing with explicit hyphens can't be done before we know the
+% following character, because we need to know if a kerning value
+% has to be inserted, hence we delay the \cs{\SOUL@everyexhyphen} call.
+% Unfortunately, the word scanner has no look-ahead mechanism.
+%
+% \begin{macrocode}
+\def\SOUL@exhyphen#1{%
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}{#1}%
+ \gdef\SOUL@eventuallyexhyphen##1{%
+ \SOUL@getkern{#1}{\SOUL@charkern}{##1}%
+ \SOUL@everyexhyphen{#1}%
+ \gdef\SOUL@eventuallyexhyphen####1{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@cmds}
+% Here is a list of pre-registered commands that the analyzer
+% cannot handle, so the scanner has to look after them. Every
+% entry consists of a handle (\cs{\\}), an identifier and the
+% macro name. The class identifier can be |9| for accents,
+% |8| for the \cs{\footnote} command, |7| for the
+% \cs{\textsuperscript} command,
+% |0| for commands without arguments and |1| for commands that
+% take one argument. Commands with two or more arguments are
+% not supported.
+%
+% \begin{macrocode}
+\SOUL@cmds={%
+ \\9\`\\9\'\\9\^\\9\"\\9\~\\9\=\\9\.%
+ \\9\u\\9\v\\9\H\\9\t\\9\c\\9\d\\9\b\\9\r
+ \\1\emph\\1\textrm\\1\textsf\\1\texttt\\1\textmd\\1\textbf
+ \\1\textup\\1\textsl\\1\textit\\1\textsc\\1\textnormal
+ \\0\rmfamily\\0\sffamily\\0\ttfamily\\0\mdseries\\0\upshape
+ \\0\slshape\\0\itshape\\0\scshape\\0\normalfont
+ \\0\em\\0\rm\\0\bf\\0\it\\0\tt\\0\sc\\0\sl\\0\sf
+ \\0\tiny\\0\scriptsize\\0\footnotesize\\0\small
+ \\0\normalsize\\0\large\\0\Large\\0\LARGE\\0\huge\\0\Huge
+ \\1\MakeUppercase\\7\textsuperscript\\8\footnote
+ \\1\textfrak\\1\textswab\\1\textgoth
+ \\0\frakfamily\\0\swabfamily\\0\gothfamily
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\soulregister}
+% \begin{macro}{\soulfont}
+% \begin{macro}{\soulaccent}
+% Register a font switching command (or some other command) for the
+% scanner. The first argument is the macro name, the second is
+% the number of arguments (|0|~or~|1|). Example: |\soulregister{\bold}{0}|.
+% \cs{\soulaccent} has only one argument---the accent macro name.
+% Example: |\soulaccent{\~}|. It is a shortcut for |\soulregister{\~}{9}|.
+% The \cs{\soulfont} command is a synonym for \cs{\soulregister}
+% and is kept for compatibility reasons.
+%
+% \begin{macrocode}
+\def\soulregister#1#2{{%
+ \edef\x{\global\SOUL@cmds={\the\SOUL@cmds
+ \noexpand\\#2\noexpand#1}}\x
+}}
+\def\soulaccent#1{\soulregister{#1}9}
+\let\soulfont\soulregister
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The analyzer}
+%
+% \begin{macro}{\SOUL@doword}
+% The only way to find out, where a given word can be broken into
+% syllables, is to let \TeX\ actually typeset the word under conditions
+% that enforce every possible hyphenation. The result is a paragraph with one
+% line for every syllable.
+%
+% \begin{macrocode}
+\def\SOUL@doword{%
+ \edef\x{\the\SOUL@word}%
+ \ifx\x\empty
+ \else
+ \SOUL@buffer={}%
+ \setbox\z@\vbox{%
+ \SOUL@tt
+ \hyphenchar\font`\-
+ \hfuzz\maxdimen
+ \hbadness\@M
+ \pretolerance\m@ne
+ \tolerance\@M
+ \leftskip\z@
+ \rightskip\z@
+ \hsize1sp
+ \everypar{}%
+ \parfillskip\z@\@plus1fil
+ \hyphenpenalty-\@M
+ \noindent
+ \hskip\z@
+ \relax
+ \the\SOUL@word}%
+ \let\SOUL@errmsg\SOUL@error
+ \let\-\relax
+ \count@\m@ne
+ \SOUL@analyze
+ \SOUL@word={}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% We store the hyphen width of the |ectt1000| font,
+% because we will need it in |\SOUL@doword|. (|ectt1000| is a mono-spaced
+% font, so every other character would have worked, too.)
+%
+% \begin{macrocode}
+\setbox\z@\hbox{\SOUL@tt-}
+\newdimen\SOUL@ttwidth
+\SOUL@ttwidth\wd\z@
+\def\SOUL@sethyphenchar{%
+ \ifnum\hyphenchar\font=\m@ne
+ \else
+ \char\hyphenchar\font
+ \fi
+}
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@analyze}
+% This macro decomposes the box that |\SOUL@doword| has built.
+% Because we have to start at the bottom, we put every
+% syllable onto the stack and execute ourselves recursively. If there
+% are no syllables left, we return from the recursion and pick syllable
+% after syllable from the stack again---this time from top to bottom---and
+% hand the syllable width |\SOUL@syllgoal| over to |\SOUL@dosyllable|.
+% All but the last syllable end with the hyphen character, hence
+% we subtract the hyphen width accordingly. After processing a
+% syllable we calculate the hyphen kern (i.\,e.~the kerning amount
+% between the last character and the hyphen). This might be needed
+% by \cs{\SOUL@everyhyphen}, which we call now.
+%
+% \begin{macrocode}
+\def\SOUL@analyze{{%
+ \setbox\z@\vbox{%
+ \unvcopy\z@
+ \unskip
+ \unpenalty
+ \global\setbox\@ne=\lastbox}%
+ \ifvoid\@ne
+ \else
+ \setbox\@ne\hbox{\unhbox\@ne}%
+ \SOUL@syllgoal=\wd\@ne
+ \advance\count@\@ne
+ \SOUL@analyze
+ \SOUL@syllwidth\z@
+ \SOUL@syllable={}%
+ \ifnum\count@>\z@
+ \advance\SOUL@syllgoal-\SOUL@ttwidth
+ \SOUL@dosyllable
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}%
+ {\SOUL@sethyphenchar}%
+ \SOUL@everyhyphen
+ \else
+ \SOUL@dosyllable
+ \fi
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@dosyllable}
+% This macro typesets token after token from \cs{\SOUL@word}
+% until \cs{\SOUL@syllwidth} has reached
+% the requested width \cs{\SOUL@syllgoal}. Furthermore the kerning
+% values are prepared in case \cs{\SOUL@everytoken} needs them.
+% The \cs{\<} command used by \cs{\so} and \cs{\caps} needs some
+% special treatment: It has to be checked for, even before
+% we can end a syllable.
+%
+% \begin{macrocode}
+\def\SOUL@dosyllable{%
+ \SOUL@gettoken
+ \SOUL@eventuallyexhyphen{\the\SOUL@token}%
+ \edef\x{\the\SOUL@token}%
+ \ifx\x\SOUL@hyphenhintM
+ \let\SOUL@n\SOUL@dosyllable
+ \else\ifx\x\SOUL@lowerthanM
+ \SOUL@gettoken
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
+ {\the\SOUL@token}%
+ \SOUL@everylowerthan
+ \SOUL@puttoken
+ \let\SOUL@n\SOUL@dosyllable
+ \else\ifdim\SOUL@syllwidth=\SOUL@syllgoal
+ \SOUL@everysyllable
+ \SOUL@puttoken
+ \let\SOUL@n\relax
+ \else\ifx\x\SOUL@stopM
+ \SOUL@errmsg
+ \global\let\SOUL@errmsg\relax
+ \let\SOUL@n\relax
+ \else
+ \setbox\tw@\hbox{\SOUL@tt\the\SOUL@token}%
+ \advance\SOUL@syllwidth\wd\tw@
+ \global\SOUL@lasttoken=\SOUL@token
+ \SOUL@gettoken
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
+ {\the\SOUL@token}%
+ \SOUL@puttoken
+ \global\SOUL@token=\SOUL@lasttoken
+ \SOUL@everytoken
+ \edef\x{\SOUL@syllable={\the\SOUL@syllable\the\SOUL@token}}\x
+ \let\SOUL@n\SOUL@dosyllable
+ \fi\fi\fi\fi
+ \SOUL@n
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@gettoken}
+% Provide the next token in \cs{\SOUL@token}. If there's already one
+% in the buffer, use that one first.
+%
+% \begin{macrocode}
+\def\SOUL@gettoken{%
+ \edef\x{\the\SOUL@buffer}%
+ \ifx\x\empty
+ \SOUL@nexttoken
+ \else
+ \global\SOUL@token=\SOUL@buffer
+ \global\SOUL@buffer={}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@puttoken}
+% The possibility to put tokens back makes the scanner design much
+% cleaner. There's only room for one token, though, so we issue
+% an error message if \cs{\SOUL@puttoken} is told to put a token
+% back while the buffer is still in use. Note that \cs{\SOUL@debug}
+% is actually undefined. This won't hurt as it can only happen
+% during driver design. No user will ever see this message.
+%
+% \begin{macrocode}
+\def\SOUL@puttoken{%
+ \edef\x{\the\SOUL@buffer}%
+ \ifx\x\empty
+ \global\SOUL@buffer=\SOUL@token
+ \global\SOUL@token={}%
+ \else
+ \SOUL@debug{puttoken called twice}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@nexttoken}
+% \begin{macro}{\SOUL@splittoken}
+% If the word buffer \cs{\SOUL@word} is empty, deliver a \cs{\SOUL@stop},
+% otherwise take the next token.
+%
+% \begin{macrocode}
+\def\SOUL@nexttoken{%
+ \edef\x{\the\SOUL@word}%
+ \ifx\x\empty
+ \SOUL@token={\SOUL@stop}%
+ \else
+ \expandafter\SOUL@splittoken\the\SOUL@word\SOUL@stop
+ \fi
+}
+\def\SOUL@splittoken#1#2\SOUL@stop{%
+ \global\SOUL@token={#1}%
+ \global\SOUL@word={#2}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@getkern}
+% Assign the kerning value between the first and the third argument
+% to the second, which has to be a \cs{\dimen} register.
+% |\SOUL@getkern{A}{\dimen0}{V}| will assign the kerning value
+% between `A' and `V' to |\dimen0|.
+%
+% \begin{macrocode}
+\def\SOUL@getkern#1#2#3{%
+ \setbox\tw@\hbox{#1#3}%
+ #2\wd\tw@
+ \setbox\tw@\hbox{#1\null#3}%
+ \advance#2-\wd\tw@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@setkern}
+% Set a kerning value if it doesn't equal 0\,pt. Of course, we could
+% also set a zero value, but that would needlessly clutter the
+% logfile.
+%
+% \begin{macrocode}
+\def\SOUL@setkern#1{\ifdim#1=\z@\else\kern#1\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@error}
+% This error message will be shown once for every word that couldn't
+% be reconstructed by \cs{\SOUL@dosyllable}.
+%
+% \begin{macrocode}
+\def\SOUL@error{%
+ \vrule\@height.8em\@depth.2em\@width1em
+ \PackageError{soul}{Reconstruction failed}{%
+ I came across hyphenatable material enclosed in group
+ braces,^^Jwhich I can't handle. Either drop the braces or
+ make the material^^Junbreakable using an \string\mbox\space
+ (\string\hbox). Note that a space^^Jalso counts as possible
+ hyphenation point. See page 4 of the manual.^^JI'm leaving
+ a black square so that you can see where I am right now.%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@setup}
+% This is a null driver, that will be used as the basis for
+% other drivers. These have then to redefine only interface commands
+% that shall differ from the default.
+%
+% \begin{macrocode}
+\def\SOUL@setup{%
+ \let\SOUL@preamble\relax
+ \let\SOUL@postamble\relax
+ \let\SOUL@everytoken\relax
+ \let\SOUL@everysyllable\relax
+ \def\SOUL@everyspace##1{##1\space}%
+ \let\SOUL@everyhyphen\relax
+ \def\SOUL@everyexhyphen##1{##1}%
+ \let\SOUL@everylowerthan\relax
+}
+\SOUL@setup
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The \so{letterspacing} driver}
+%
+% \begin{macro}{\SOUL@sosetletterskip}
+% A handy helper macro that sets the inter-letter skip with a
+% draconian \cs{\penalty}.
+%
+% \begin{macrocode}
+\def\SOUL@sosetletterskip{\nobreak\hskip\SOUL@soletterskip}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@sopreamble}
+% If letterspacing (\cs{\so} or \cs{\caps}) follows a white space, we
+% replace it with our \syn{outer space}. \LaTeX\ uses |\hskip1sp| as
+% marker in tabular entries, so we ignore tiny skips.
+%
+% \begin{macrocode}
+\def\SOUL@sopreamble{%
+ \ifdim\lastskip>5sp
+ \unskip
+ \hskip\SOUL@soouterskip
+ \fi
+ \spaceskip\SOUL@soinnerskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@sopostamble}
+% Start the look-ahead scanner \cs{\SOUL@socheck} outside the \cs{\SOUL@}
+% scope. That's why we make the \syn{outer space} globally available in
+% \cs{\skip@}.
+%
+% \begin{macrocode}
+\def\SOUL@sopostamble{%
+ \global\skip@=\SOUL@soouterskip
+ \aftergroup\SOUL@socheck
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@socheck}
+% \begin{macro}{\SOUL@sodoouter}
+% Read the next token after the \soul\ command into \cs{\SOUL@@}
+% and examine it. If it's some kind of space, replace it with
+% \syn{outer space} and the appropriate penalty, else if it's
+% a closing brace, continue scanning. If it is neither: do nothing.
+%
+% \begin{macrocode}
+\def\SOUL@socheck{%
+ \futurelet\SOUL@@\SOUL@sodoouter
+}
+\def\SOUL@sodoouter{%
+ \def\SOUL@n*##1{\hskip\skip@}%
+ \ifcat\egroup\noexpand\SOUL@@
+ \unkern
+ \egroup
+ \def\SOUL@n*{\afterassignment\SOUL@socheck\let\SOUL@x=}%
+ \else\ifx\SOUL@spc\SOUL@@
+ \def\SOUL@n* {\hskip\skip@}%
+ \else\ifx~\SOUL@@
+ \def\SOUL@n*~{\nobreak\hskip\skip@}%
+ \else\ifx\ \SOUL@@
+ \else\ifx\space\SOUL@@
+ \else\ifx\@xobeysp\SOUL@@
+ \else
+ \def\SOUL@n*{}%
+ \let\SOUL@@\relax
+ \fi\fi\fi\fi\fi\fi
+ \SOUL@n*%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeverytoken}
+% Typeset the token and put an unbreakable inter-letter skip
+% thereafter. If the token is \cs{\<} then remove the last skip instead.
+% Gets the character kerning value between the actual and the
+% next token in \cs{\SOUL@charkern}.
+%
+% \begin{macrocode}
+\def\SOUL@soeverytoken{%
+ \edef\x{\the\SOUL@token}%
+ \ifx\x\SOUL@lowerthanM
+ \else
+ \global\let\SOUL@soeventuallyskip\SOUL@sosetletterskip
+ \the\SOUL@token
+ \SOUL@gettoken
+ \edef\x{\the\SOUL@token}%
+ \ifx\x\SOUL@stopM
+ \else
+ \SOUL@setkern\SOUL@charkern
+ \SOUL@sosetletterskip
+ \SOUL@puttoken
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeveryspace}
+% This macro sets an \syn{inner space}. The argument may contain
+% penalties and is used for the |~| command. This construction was
+% needed to make colored underlines work, without having to put
+% any of the coloring commands into the core. |\kern\z@| prevents
+% in subsequent \cs{\so} commands that the second discards the
+% \syn{outer space} of the first. To remove the space simply
+% use |\unkern\unskip|.
+%
+% \begin{macrocode}
+\def\SOUL@soeveryspace#1{#1\space\kern\z@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeveryhyphen}
+% Sets implicit hyphens. The kerning value between the current token
+% and the hyphen character is passed in \cs{\SOUL@hyphkern}.
+%
+% \begin{macrocode}
+\def\SOUL@soeveryhyphen{%
+ \discretionary{%
+ \unkern
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@sethyphenchar
+ }{}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeveryexhyphen}
+% Sets the explicit hyphen that is passed as argument.
+% \cs{\SOUL@soeventuallyskip} equals \cs{\SOUL@sosetletterskip},
+% except when a \cs{\<} had been detected. This is necessary because
+% \cs{\SOUL@soeveryexhyphen} wouldn't know otherwise, that it
+% follows a~\cs{\<}.
+%
+% \begin{macrocode}
+\def\SOUL@soeveryexhyphen#1{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@soeventuallyskip
+ \hbox{#1}%
+ \discretionary{}{}{%
+ \SOUL@setkern\SOUL@charkern
+ }%
+ \SOUL@sosetletterskip
+ \global\let\SOUL@soeventuallyskip\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeverylowerthan}
+% Let \cs{\<} remove the last inter-letter skip. Set the kerning value
+% between the token before and that after the \cs{\<} command.
+%
+%
+% \begin{macrocode}
+\def\SOUL@soeverylowerthan{%
+ \unskip
+ \unpenalty
+ \global\let\SOUL@soeventuallyskip\relax
+ \SOUL@setkern\SOUL@charkern
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@sosetup}
+% Override all interface macros by our letterspacing versions. The
+% only unused macro is \cs{\SOUL@everysyllable}.
+%
+% \begin{macrocode}
+\def\SOUL@sosetup{%
+ \SOUL@setup
+ \let\SOUL@preamble\SOUL@sopreamble
+ \let\SOUL@postamble\SOUL@sopostamble
+ \let\SOUL@everytoken\SOUL@soeverytoken
+ \let\SOUL@everyspace\SOUL@soeveryspace
+ \let\SOUL@everyhyphen\SOUL@soeveryhyphen
+ \let\SOUL@everyexhyphen\SOUL@soeveryexhyphen
+ \let\SOUL@everylowerthan\SOUL@soeverylowerthan
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@setso}
+% A handy macro for internal use.
+%
+% \begin{macrocode}
+\def\SOUL@setso#1#2#3{%
+ \def\SOUL@soletterskip{#1}%
+ \def\SOUL@soinnerskip{#2}%
+ \def\SOUL@soouterskip{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\sodef}
+% This macro assigns the letterspacing skips as well as an optional
+% font switching command to a command sequence name. \cs{\so} itself
+% will be defined using this macro.
+%
+% \begin{macrocode}
+\def\sodef#1#2#3#4#5{%
+ \DeclareRobustCommand*#1{\SOUL@sosetup
+ \def\SOUL@preamble{%
+ \SOUL@setso{#3}{#4}{#5}%
+ #2%
+ \SOUL@sopreamble
+ }%
+ \SOUL@
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\resetso}
+% Let \cs{\resetso} define reasonable default values for letterspacing.
+%
+% \begin{macrocode}
+\def\resetso{%
+ \sodef\textso{}{.25em}{.65em\@plus.08em\@minus.06em}%
+ {.55em\@plus.275em\@minus.183em}%
+}
+\resetso
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\sloppyword}
+% Set up a letterspacing macro that inserts slightly stretchable
+% space between the characters. This can be used to typeset long
+% words in narrow columns, where ragged paragraphs are undesirable.
+% See section~\ref{sec:sloppyword}.
+%
+% \begin{macrocode}
+\sodef\sloppyword{%
+ \linepenalty10
+ \hyphenpenalty10
+ \adjdemerits\z@
+ \doublehyphendemerits\z@
+ \finalhyphendemerits\z@
+ \emergencystretch.1em}%
+ {\z@\@plus.1em}%
+ {.33em\@plus.11em\@minus.11em}%
+ {.33em\@plus.11em\@minus.11em}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection[The \caps{caps} driver]{The caps driver}
+%
+% \begin{macro}{\caps}
+% Unless run under \LaTeX, make \cs{\caps} just another simple letterspacing
+% macro that selects a font \cs{\capsfont} (defaulting to \cs{\relax}) but
+% doesn't have any special capabilities.
+%
+% \begin{macrocode}
+\ifx\documentclass\@undefined
+\let\capsfont\relax
+\let\capsreset\relax
+\def\capsdef#1#2#3#4#5{}
+\def\capssave#1{}
+\def\capsselect#1{}
+\sodef\textcaps{\capsfont}
+ {.028em\@plus.005em\@minus.01em}%
+ {.37em\@plus.1667em\@minus.111em}%
+ {.37em\@plus.1em\@minus.14em}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\capsreset}
+% \dots\ else, if run under \LaTeX\ prepare a set of macros that
+% maintain a database with certain letterspacing values for different
+% fonts. \cs{\capsreset} clears the database and inserts a default rule.
+%
+% \begin{macrocode}
+\else
+\DeclareRobustCommand*\capsreset{%
+ \let\SOUL@capsbase\empty
+ \SOUL@capsdefault
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\capsdef}
+% Add an entry to the database, which is of course nothing else than
+% a \TeX\ macro. See section ``List macros'' of appendix~D in the
+% \TeX{}book~\cite{DEK} for details.
+%
+% \begin{macrocode}
+\def\capsdef#1#2#3#4#5{{%
+ \toks\z@{\\{#1/#2/#3/#4/#5}}%
+ \toks\tw@=\expandafter{\SOUL@capsbase}%
+ \xdef\SOUL@capsbase{\the\toks\z@\the\toks\tw@}%
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\capssave}
+% \begin{macro}{\capsselect}
+% Save the current database in a macro within the |SOUL@| namespace
+% and let |\capsselect| restore this database.
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\capssave[1]{%
+ \expandafter\global\expandafter\let
+ \csname SOUL@db@#1\endcsname\SOUL@capsbase
+}
+\DeclareRobustCommand*\capsselect[1]{%
+ \expandafter\let\expandafter\SOUL@capsbase
+ \csname SOUL@db@#1\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@capsfind}
+% \begin{macro}{\SOUL@caps}
+% Go through the database entries and pick the first entry that matches
+% the currently active font. Then define an internal macro that uses
+% the respective spacing values in a macro that is equivalent to the
+% \cs{\textso} command.
+%
+% \begin{macrocode}
+\def\SOUL@capsfind#1/#2/#3/#4/#5/#6/#7/#8/#9/{%
+ \let\SOUL@match=1%
+ \SOUL@chk{#1}\f@encoding
+ \SOUL@chk{#2}\f@family
+ \SOUL@chk{#3}\f@series
+ \SOUL@chk{#4}\f@shape
+ \SOUL@dimchk{#5}\f@size
+ \if\SOUL@match1%
+ \let\\\@gobble
+ \gdef\SOUL@caps{%
+ \SOUL@sosetup
+ \def\SOUL@preamble{\SOUL@setso{#7}{#8}{#9}#6%
+ \SOUL@sopreamble}%
+ \SOUL@}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@chk}
+% Sets the \cs{\SOUL@match} flag if both parameters are equal.
+% This is used for all \caps{\small NFSS} elements except the font size.
+%
+% \begin{macrocode}
+\def\SOUL@chk#1#2{%
+ \if$#1$%
+ \else
+ \def\SOUL@n{#1}%
+ \ifx#2\SOUL@n\else\let\SOUL@match=0\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@dimchk}
+% \begin{macro}{\SOUL@rangechk}
+% We do not only want to check if a given font size |#1| matches |#2|,
+% but also if it fits into a given range. An omitted lower boundary
+% is replaced by \cs{\z@} and an omitted upper boundary by \cs{\maxdimen}.
+% The first of a series of \cs{\SOUL@chk} and \cs{\SOUL@dimchk}
+% statements, which detects that the arguments don't match, sets the
+% \cs{\SOUL@match} flag to zero. A value of~1 indicates that an
+% entry in the font database matches the currently used font.
+%
+% \begin{macrocode}
+\def\SOUL@dimchk#1#2{\if$#1$\else\SOUL@rangechk{#2}#1--\@ne\@@\fi}
+\def\SOUL@rangechk#1#2-#3-#4\@@{%
+ \count@=#4%
+ \ifnum\count@>\z@
+ \ifdim#1\p@=#2\p@\else\let\SOUL@match=0\fi
+ \else
+ \SOUL@dimen=\if$#2$\z@\else#2\p@\fi
+ \ifdim#1\p@<\SOUL@dimen\let\SOUL@match=0\fi
+ \SOUL@dimen=\if$#3$\maxdimen\else#3\p@\fi
+ \ifdim#1\p@<\SOUL@dimen\else\let\SOUL@match=0\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\textcaps}
+% Find a matching entry in the database and start the letterspacing
+% mechanism with the given spacing values.
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\textcaps{{%
+ \def\\##1{\expandafter\SOUL@capsfind##1/}%
+ \SOUL@capsbase
+ \aftergroup\SOUL@caps
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@capsdefault}
+% Define a default database entry and a default font.
+%
+% \begin{macrocode}
+\def\SOUL@capsdefault{%
+ \capsdef{////}%
+ \SOUL@capsdfltfnt
+ {.028em\@plus.005em\@minus.01em}%
+ {.37em\@plus.1667em\@minus.1em}%
+ {.37em\@plus.111em\@minus.14em}%
+}
+\let\SOUL@capsdfltfnt\scshape
+\capsreset
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The \ul{underlining} driver}
+%
+% \begin{macro}{\SOUL@ulleaders}
+% This macro sets the underline under the following \cs{\hskip}.
+%
+% \begin{macrocode}
+\newdimen\SOUL@uldp
+\newdimen\SOUL@ulht
+\def\SOUL@ulleaders{%
+ \leaders\hrule\@depth\SOUL@uldp\@height\SOUL@ulht\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulunderline}
+% Set an underline under the given material. It draws the line first,
+% and the given material afterwards. This is needed for highlighting,
+% but gives less than optimal results for colored overstriking, which,
+% however, will hardly ever be used, anyway.
+%
+% \begin{macrocode}
+\def\SOUL@ulunderline#1{{%
+ \setbox\z@\hbox{#1}%
+ \SOUL@dimen=\wd\z@
+ \SOUL@dimeni=\SOUL@uloverlap
+ \advance\SOUL@dimen2\SOUL@dimeni
+ \rlap{%
+ \null
+ \kern-\SOUL@dimeni
+ \SOUL@ulcolor{\SOUL@ulleaders\hskip\SOUL@dimen}%
+ }%
+ \unhcopy\z@
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulpreamble}
+% Just set up the line dimensions and the space skip. Normally,
+% \cs{\spaceskip} is unset and not used by \TeX. We need it, though,
+% because we feed it to the \cs{\leaders} primitive.
+%
+% \begin{macrocode}
+\def\SOUL@ulpreamble{%
+ \SOUL@uldp=\SOUL@uldepth
+ \SOUL@ulht=-\SOUL@uldp
+ \advance\SOUL@uldp\SOUL@ulthickness
+ \spaceskip\SOUL@spaceskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleverysyllable}
+% By using \cs{\SOUL@everysyllable} we don't have to care about
+% kerning values and get better results for highlighting, where
+% negative kerning values would otherwise cut off characters.
+%
+% \begin{macrocode}
+\def\SOUL@uleverysyllable{%
+ \SOUL@ulunderline{%
+ \the\SOUL@syllable
+ \SOUL@setkern\SOUL@charkern
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleveryspace}
+% Set a given penalty and an underlined \cs{\space} equivalent.
+% The \cs{\null} prevents a nasty gap in |\textfrak| |{a \textswab{b}}|,
+% while it doesn't seem to hurt in all other cases. I didn't investigate
+% this.
+%
+% \begin{macrocode}
+\def\SOUL@uleveryspace#1{%
+ \SOUL@ulcolor{%
+ #1%
+ \SOUL@ulleaders
+ \hskip\spaceskip
+ }%
+ \null
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleveryhyphen}
+% If hyphenation takes place, output an underlined hyphen with the
+% required hyphen kerning value.
+%
+% \begin{macrocode}
+\def\SOUL@uleveryhyphen{%
+ \discretionary{%
+ \unkern
+ \SOUL@ulunderline{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@sethyphenchar
+ }%
+ }{}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleveryexhyphen}
+% Underline the given hyphen, en-dash, em-dash or \cs{\slash} and care
+% for kerning.
+%
+% \begin{macrocode}
+\def\SOUL@uleveryexhyphen#1{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@ulunderline{#1}%
+ \discretionary{}{}{%
+ \SOUL@setkern\SOUL@charkern
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulcolor}
+% \begin{macro}{\setulcolor}
+% Define the underline color or turn off coloring, in which case the lines are not
+% just colored black, but remain uncolored. This makes them appear
+% black, nevertheless, and has the advantage, that no Postscript
+% \cs{\specials} are cluttering the output.
+%
+% \begin{macrocode}
+\let\SOUL@ulcolor\relax
+\def\setulcolor#1{%
+ \if$#1$
+ \let\SOUL@ulcolor\relax
+ \else
+ \def\SOUL@ulcolor{\textcolor{#1}}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\setuloverlap}
+% \begin{macro}{\SOUL@uloverlap}
+% Set the overlap amount, that helps to avoid gaps on sloppy output
+% devices.
+%
+% \begin{macrocode}
+\def\setuloverlap#1{\def\SOUL@uloverlap{#1}}
+\setuloverlap{.25pt}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulsetup}
+% The underlining driver is quite simple. No need for \cs{\SOUL@postamble}
+% and \cs{\SOUL@everytoken}.
+%
+% \begin{macrocode}
+\def\SOUL@ulsetup{%
+ \SOUL@setup
+ \let\SOUL@preamble\SOUL@ulpreamble
+ \let\SOUL@everysyllable\SOUL@uleverysyllable
+ \let\SOUL@everyspace\SOUL@uleveryspace
+ \let\SOUL@everyhyphen\SOUL@uleveryhyphen
+ \let\SOUL@everyexhyphen\SOUL@uleveryexhyphen
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@textul}
+% Describing self-explanatory macros is \emph{so} boring!
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\textul{\SOUL@ulsetup\SOUL@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\setul}
+% \begin{macro}{\SOUL@uldepth}
+% \begin{macro}{\SOUL@ulthickness}
+% Set the underlining dimensions. Either value may be omitted and
+% lets the respective macro keep its current contents.
+%
+% \begin{macrocode}
+\def\setul#1#2{%
+ \if$#1$\else\def\SOUL@uldepth{#1}\fi
+ \if$#2$\else\def\SOUL@ulthickness{#2}\fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\resetul}
+% Set reasonable default values that fit most latin fonts.
+%
+% \begin{macrocode}
+\def\resetul{\setul{.65ex}{.1ex}}
+\resetul
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\setuldepth}
+% This macro sets all designated ``letters'' (\cs{\catcode=11}) or the
+% given material in a box and sets the underlining dimensions according
+% to the box depth.
+%
+% \begin{macrocode}
+\def\setuldepth#1{{%
+ \def\SOUL@n{#1}%
+ \setbox\z@\hbox{%
+ \tracinglostchars\z@
+ \ifx\SOUL@n\empty
+ \count@\z@
+ \loop
+ \ifnum\catcode\count@=11\char\count@\fi
+ \ifnum\count@<\@cclv
+ \advance\count@\@ne
+ \repeat
+ \else
+ #1%
+ \fi
+ }%
+ \SOUL@dimen\dp\z@
+ \advance\SOUL@dimen\p@
+ \xdef\SOUL@uldepth{\the\SOUL@dimen}%
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The \st{overstriking} driver}
+%
+% \begin{macro}{\SOUL@stpreamble}
+% Striking out is just underlining with a raised line of a different
+% color. Hence we only need to define the preamble accordingly and
+% let the underlining preamble finally do its job. Not that colored
+% overstriking was especially useful, but we want at least to keep
+% it black while we might want to set underlines in some fancy color.
+%
+% \begin{macrocode}
+\def\SOUL@stpreamble{%
+ \SOUL@dimen\SOUL@ulthickness
+ \SOUL@dimeni=-.5ex
+ \advance\SOUL@dimeni-.5\SOUL@dimen
+ \edef\SOUL@uldepth{\the\SOUL@dimeni}%
+ \let\SOUL@ulcolor\SOUL@stcolor
+ \SOUL@ulpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@stsetup}
+% We re-use the whole underlining setup and just replace the preamble
+% with our modified version.
+%
+% \begin{macrocode}
+\def\SOUL@stsetup{%
+ \SOUL@ulsetup
+ \let\SOUL@preamble\SOUL@stpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\textst}
+% These pretzels are making me thirsty \dots
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\textst{\SOUL@stsetup\SOUL@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@stcolor}
+% \begin{macro}{\setstcolor}
+% Set the overstriking color. This won't be used often, but is required
+% in cases, where the underlines are colored. You wouldn't want to
+% overstrike in the same color. Note that overstriking lines are
+% drawn \emph{beneath} the text, hence bright colors won't look good.
+%
+% \begin{macrocode}
+\let\SOUL@stcolor\relax
+\def\setstcolor#1{%
+ \if$#1$
+ \let\SOUL@stcolor\relax
+ \else
+ \def\SOUL@stcolor{\textcolor{#1}}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The highlighting driver}
+%
+% \begin{macro}{\SOUL@hlpreamble}
+% This is nothing else than overstriking with very thick lines.
+%
+% \begin{macrocode}
+\def\SOUL@hlpreamble{%
+ \setul{}{2.5ex}%
+ \let\SOUL@stcolor\SOUL@hlcolor
+ \SOUL@stpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@hlsetup}
+% No need to re-invent the wheel. Just use the overstriking setup
+% with a different preamble.
+%
+% \begin{macrocode}
+\def\SOUL@hlsetup{%
+ \SOUL@stsetup
+ \let\SOUL@preamble\SOUL@hlpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\texthl}
+% \begin{macro}{\sethlcolor}
+% \begin{macro}{\SOUL@hlcolor}
+% Define the highlighting macro and the color setting macro with a
+% simple default color. Yellow isn't really pleasing, but it's already
+% predefined by the \package{color} package.
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\texthl{\SOUL@hlsetup\SOUL@}
+\def\sethlcolor#1{\if$#1$\else\def\SOUL@hlcolor{\textcolor{#1}}\fi}
+\sethlcolor{yellow}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection*{The package postamble}
+%
+% \begin{macro}{\so}
+% \begin{macro}{\ul}
+% \begin{macro}{\st}
+% \begin{macro}{\hl}
+% \begin{macro}{\caps}
+% OK, I lied. The short macro names are just abbreviations for their
+% longer counterpart. Some people might be used to |\text*| style commands
+% to select a certain font. And then it doesn't hurt to reserve
+% these early enough.
+%
+% \begin{macrocode}
+\let\so\textso
+\let\ul\textul
+\let\st\textst
+\let\hl\texthl
+\let\caps\textcaps
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% When used in an environment other than \LaTeX\ and the \package{german}
+% package was already loaded, define the double quotes as accent.
+%
+% \begin{macrocode}
+\ifx\documentclass\@undefined
+ \ifx\mdqoff\@undefined
+ \else
+ \soulaccent{"}%
+ \fi
+ \catcode`\@=\atcode
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% If we have been loaded by a \LaTeX\ environment and the \package{color}
+% package wasn't also loaded, we disable all colors. Then we add the umlaut accent
+% |"| if the \package{german} package is present. The quotes character has to
+% be \cs{\catcode}'d \cs{\active} now, or it won't get recognized later.
+% The \option{capsdefault}
+% option overrides the \cs{\caps} driver and lets \cs{\SOUL@} set an underline.
+% Finally load the local configuration, process the |capsdefault|
+% option and exit.
+%
+% \begin{macrocode}
+\else
+ \bgroup
+ \catcode`\"\active
+ \AtBeginDocument{%
+ \@ifundefined{color}{%
+ \let\SOUL@color\relax
+ \let\setulcolor\@gobble
+ \let\setstcolor\@gobble
+ \let\sethlcolor\@gobble
+ \let\hl\ul
+ }{}
+ \@ifundefined{mdqoff}{}{\soulaccent{"}}
+ }
+ \egroup
+ \DeclareOption{capsdefault}{%
+ \AtBeginDocument{%
+ \def\SOUL@capsdfltfnt#1{%
+ \SOUL@ulsetup
+ \SOUL@ulpreamble
+ \scshape
+ }%
+ }%
+ }
+ \InputIfFileExists{soul.cfg}%
+ {\PackageInfo{soul}{Local config file soul.cfg used}}{}
+ \ProcessOptions
+\fi
+\endinput
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \vspace{2explus1fill}
+%\begin{verbatim}
+%$Id$
+%\end{verbatim}
+% \Finale
+%
+%
+% ^^A.E.I.O.U.^^
+%^^A vim:ts=4:sw=4:et
diff --git a/macros/generic/soul/soul-ori.pdf b/macros/generic/soul/soul-ori.pdf
new file mode 100644
index 0000000000..d8673fc20d
--- /dev/null
+++ b/macros/generic/soul/soul-ori.pdf
Binary files differ
diff --git a/macros/generic/soul/soul.dtx b/macros/generic/soul/soul.dtx
index 064634cf11..7bc4bb1ba6 100644
--- a/macros/generic/soul/soul.dtx
+++ b/macros/generic/soul/soul.dtx
@@ -1,4520 +1,1144 @@
-% \iffalse
-%% File: soul.dtx Copyright (C) 1998--2003 Melchior FRANZ
-%% $Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel $
-%% $Version: 2.4 $
-%
-%<*batchfile>
-%
-% on Unix/Linux just run "make" to get the style file and the documentation,
-% else generate the driver soul.ins (if you don't already have it):
-%
-% $ latex soul.dtx
-%
-% You'll probably get an error message that you may ignore. Now generate
-% the style file:
-%
-% $ tex soul.ins
-%
-% And finally to produce the documentation run LaTeX three times:
-%
-% $ latex soul.dtx
-%
-%
-%
-%
-% DISCLAIMER: note that a Makefile could actually contain malign commands
-% that erase your whole account, so having a look at it before won't hurt!
-% I take no responsibility for any damage, but I do what I can to make
-% using the original Makefile safe.
-%
-% COPYRIGHT NOTICE:
-% This package is free software that can be redistributed and/or modified
-% under the terms of the LaTeX Project Public License as specified
-% in the file macros/latex/base/lppl.txt on any CTAN archive server,
-% such as ftp://ftp.dante.de/.
-%
-%$
-%% ====================================================================
-%% @LaTeX-package-file{
-%% author = "Melchior FRANZ",
-%% version = "2.4",
-%% date = "17 November 2003",
-%% filename = "soul.dtx",
-%% address = "Melchior FRANZ
-%% Rieder Hauptstrasse 52
-%% A-5212 SCHNEEGATTERN
-%% AUSTRIA",
-%% telephone = "++43 7746 3109",
-%% URL = "http://www.unet.univie.ac.at/~a8603365/",
-%% email = "a8603365@unet.univie.ac.at",
-%% codetable = "ISO/ASCII",
-%% keywords = "spacing out, letterspacing, underlining, striking out,
-%% highlighting",
-%% supported = "yes",
-%% docstring = "This article describes the `soul' package, which
-%% provides hyphenatable letterspacing (spacing out),
-%% underlining, and some derivatives.
-%% All features are based upon a common mechanism
-%% that allows to typeset text syllable by syllable,
-%% where the excellent TeX hyphenation algorithm is
-%% used to find the proper hyphenation points.
-%% Two examples show how to use the provided interface to
-%% implement things such as `an-a-lyz-ing syl-la-bles'.
-%% Although the package is optimized for LaTeX2e,
-%% it works with Plain TeX and with other
-%% packages, too.",
-%% }
-%% ====================================================================
-%
-%
-%
-%
-%
-\begin{filecontents}{soul.ins}
-\def\batchfile{soul.ins}
-\input docstrip.tex
-\askforoverwritefalse
-\keepsilent % <-- this is for you, Christina ;-)
-\generate{\file{soul.sty}{\from{soul.dtx}{package}}}
-\endbatchfile
-\end{filecontents}
-%</batchfile>
-%
-%
-%
-%
-%
+% \iffalse meta-comment
+%
+% File: soul.dtx
+% Version: 2023-02-18 v3.0
+% Info: Permit use of UTF-8 characters in soul
+%
+% Copyright (C) 2007 Heiko Oberdiek
+% Copyright (C) 2016-2023 Oberdiek Package Support Group
+% https://github.com/ho-tex/soul/issues
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any later
+% version. This version of this license is in
+% https://www.latex-project.org/lppl/lppl-1-3c.txt
+% and the latest version of this license is in
+% https://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 Maintainers of this work are
+% Heiko Oberdiek and the Oberdiek Package Support Group
+% https://github.com/ho-tex/soul/issues
+%
+% The Base Interpreter refers to any `TeX-Format',
+% because some files are installed in TDS:tex/generic//.
+%
+% This work consists of the main source file soul.dtx
+% and the derived files
+% soul.sty, soul.pdf, soul.ins,soulutf8.sty
+% soulutf8-test1.tex, soulutf8-test2.tex, soulutf8-test3.tex,
+% soulutf8-test4.tex, soulutf8-test5.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/soul/soul.dtx
+% CTAN:macros/latex/contrib/soul/soul.pdf
+%
+% Unpacking:
+% tex soul.ins
%<*driver>
-\def\fileversion{2.4}
-\def\filedate{2003/11/17}
-%
-%
-%
\documentclass{ltxdoc}
-%
-%
-%
-\makeatletter\let\SOUL@sethyphenchar\relax\makeatother
-\IfFileExists{soul.sty}{%
- \usepackage{soul}[2002/01/10]
- \expandafter\ifx\csname sloppyword\endcsname\relax % old version?
- \def\sloppyword{\textbf{?? [obsolete soul version]}}
- \fi
- \let\SOULSTYfound\active
-}{%
- \GenericWarning{soul.dtx}{%
- Package file `soul.sty' couldn't be found. You should however find^^J^^A
- a file `soul.ins' in the current directory. If you type "tex soul.ins"^^J^^A
- on the command line, `soul.sty' will be generated. After that
- run "latex soul.dtx" again and you won't see this message again.
- }%
-}%
-%
-%
-%
-\ifx\makehyperref\SOULundefined
- \newcommand*\texorpdfstring[2]{#1}
-\else ^^A for "make hyper"
- \usepackage{hyperref}
- \hypersetup{
- bookmarksopen,
- colorlinks,
- pdftitle={The soul package},
- pdfauthor={Melchior FRANZ},
- pdfsubject={${}$Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel ${}$},
- pdfkeywords={space out, letterspacing, underlining, overstriking, highlighting}
- }
- \usepackage[pdftex]{graphicx,color}
-\fi
-%
-%
-%
-%\RecordChanges
-%
+\usepackage{holtxdoc}[2011/11/22]
\begin{document}
-\setcounter{tocdepth}{2}
-\DocInput{soul.dtx}
+ \DocInput{soul.dtx}%
\end{document}
%</driver>
% \fi
%
-%
-%
-%
-%
-%
-%
-% \CheckSum{2006}
-% \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 \~}
-%
-%
-%
-% \title{The \texttt{soul} package}
-%
-% \author{Melchior \caps{FRANZ}}
-%
-% \date{November 17, 2003}
-%
-%^^A=====================================================
-%
-%^^A These messy macros allow to typeset the `example' sections
-%^^A conveniently. You'd better ignore them. I do! :-)
-%
-% \makeatletter
-%
-% \def\squarebull{\rule[.2ex]{.8ex}{.8ex}}
-%
-% \newenvironment{examples}
-% {\parindent\z@\small\fontencoding{OT1}\selectfont}
-% {\rule{\hsize}{.4pt}}
-%
-% \def\soultest#1|{\bgroup\rule[.5ex]{\hsize}{.4pt}\par
-% \parbox[t]{.34\hsize}{\raggedright\textit{#1\unskip.}}%
-% \hspace{1.5em}$\vtop\bgroup\hb@xt@.4\hsize\bgroup
-% \llap{\squarebull\hspace{.4em}}\soulttest}
-%
-% {\catcode`\|=13\gdef\soulttest{%
-% \bgroup\def\do##1{\catcode`##1=12}\dospecials\ttfamily
-% \catcode`\|=13\unskip\def|{\hss\egroup\egroup\soultttest}}}
-%
-% \def\soultttest#1{\hbox{\vtop{\hsize.4\hsize\hbadness\@M
-% \leavevmode\llap{\squarebull\hspace{.4em}}#1\null}}%
-% \egroup$\hspace{1.5em}\parbox[t]{1mm}{\hyphenpenalty-\@M
-% \exhyphenpenalty-\@M\hbadness\@M\hfuzz\maxdimen
-% \strut\llap{\squarebull\hspace{.4em}}#1\null}%
-% \goodbreak\vspace{2ex}
-% \egroup}
-%
-% \newcommand*\DescribeOption[1]{\marginpar{\raggedleft\textsf{#1}\ignorespaces}}
-%
-%
-%^^A similar to the `description' environment
-%
-% \def\describemacro{^^A
-% \bgroup
-% \let\do\@makeother
-% \dospecials
-% \catcode`{=1
-% \catcode`}=2
-% \SOUL@@@descmacro
-% }
-%
-% \def\SOUL@@@descmacro#1{^^A
-% \texttt{#1}^^A
-% \DescribeMacro{#1}^^A
-% \expandafter\edef\expandafter\x\expandafter{\expandafter\@gobble#1}^^A
-% \expandafter\label{cmd:\x}^^A
-% \egroup
-% }
-%
-%
-% \def\SOUL@@@verbitem[#1: {^^A
-% \bgroup
-% \let\do\@makeother
-% \dospecials
-% \SOUL@@@verbscan{#1}^^A
-% }
-%
-% \def\SOUL@@@verbscan#1#2]{^^A
-% \egroup
-% \goodbreak
-% \def\@currentlabel{\S\,\the\SOUL@@@itemnr}^^A
-% \label{par:#1}^^A
-% \SOUL@@@item[\textbf{\@currentlabel\hskip.6em#1:}]\hfil\break
-% Example: \texttt{#2}\hfil\break^^A
-% \advance\SOUL@@@itemnr1
-% }
-%
-% \let\SOUL@@@item\item
-% \newcount\SOUL@@@itemnr
-%
-% \newenvironment{verblist}[1]{^^A
-% \SOUL@@@itemnr=#1
-% \list{}{^^A
-% \settowidth{\labelwidth}{\indent\indent}^^A
-% \leftmargin\labelwidth
-% \advance\leftmargin\labelsep
-% \def\makelabel##1{##1}^^A
-% \let\item\SOUL@@@verbitem
-% }^^A
-% }{^^A
-% \endlist
-% }
-%
-% \newenvironment{labeling}[1]{^^A
-% \list{}{^^A
-% \settowidth{\labelwidth}{\textbf{#1}}^^A
-% \leftmargin\labelwidth\advance\leftmargin\labelsep
-% \def\makelabel##1{\textbf{##1}\hfil}^^A
-% }^^A
-% }{^^A
-% \endlist
-% }
-%
-% \newenvironment{syntax}{^^A
-% \par\medskip\def\<##1>{$\langle$\syn{##1}$\rangle$}^^A
-% \indent\begin{tabular}{l}^^A
-% }{^^A
-% \end{tabular}^^A
-% \noindentafter\medbreak
-% }
-%
-%
-% \newenvironment{example}[1][.9\textwidth]
-% {\par\medskip\indent\begin{tabular}{p{#1}l}}
-% {\end{tabular}\noindentafter\medbreak}
-%
-% \newcommand*\noindentafter{^^A
-% \global\everypar{{\setbox\z@\lastbox}\everypar{}}}
-%
-% \newcommand*\errsquare{\leavevmode\vrule height.8em depth.2em width1em\relax}
-%
-%
-% \ifx\SOULSTYfound\active
-%^^A analyze syllables---described somewhere below
-%
-% \DeclareRobustCommand*\sy{^^A
-% \SOUL@setup
-% \def\SOUL@preamble{\lefthyphenmin0\righthyphenmin0}^^A
-% \def\SOUL@everysyllable{\the\SOUL@syllable}^^A
-% \def\SOUL@everyspace##1{##1\space}^^A
-% \def\SOUL@everyhyphen{^^A
-% \discretionary{^^A
-% \SOUL@setkern\SOUL@hyphkern
-% \SOUL@sethyphenchar
-% }{}{^^A
-% \hbox{\kern1pt$\cdot$}^^A
-% }^^A
-% }^^A
-% \def\SOUL@everyexhyphen##1{^^A
-% \SOUL@setkern\SOUL@hyphkern
-% \hbox{##1}^^A
-% \discretionary{}{}{^^A
-% \SOUL@setkern\SOUL@charkern
-% }^^A
-% }^^A
-% \SOUL@}
-%
-%^^A analyze the engine---described somewhere below, too
-%
-% \DeclareRobustCommand*\an{^^A
-% \def\SOUL@preamble{$^{^P}$}^^A
-% \def\SOUL@everyspace##1{##1\texttt{\char`\ }}^^A
-% \def\SOUL@postamble{$^{^E}$}^^A
-% \def\SOUL@everyhyphen{$^{^-}$}^^A
-% \def\SOUL@everyexhyphen##1{##1$^{^=}$}^^A
-% \def\SOUL@everysyllable{$^{^S}$}^^A
-% \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}^^A
-% \def\SOUL@everylowerthan{$^{^L}$}^^A
-% \SOUL@}
-%
-%^^A magazine-like (truly awful) paragraphs
-%^^A If you know what you're doing, you can copy it to your personal `soul.cfg' file.
-%
-% \DeclareRobustCommand*\magstylepar{\SOUL@sosetup
-% \def\SOUL@preamble{^^A
-% \edef\SOUL@soletterskip{\z@\@plus\fontdimen2\font\@minus\z@}^^A
-% \edef\SOUL@soinnerskip{\the\fontdimen2\font
-% \@plus\the\fontdimen3\font\@minus\the\fontdimen4\font}^^A
-% \let\SOUL@soouterskip\SOUL@soinnerskip
-% \SOUL@sopreamble}^^A
-% \lefthyphenmin2\righthyphenmin2\SOUL@}
-%
-%\else
-%
-%^^A The package has not been found, so we're providing some dummies, just
-%^^A to avoid all these `Undefined command sequence' messages.
-%
-% \def\SOUL@@@X#1{\textbf{??}}%
-% \let\so\SOUL@@@X
-% \let\textso\SOUL@@@X
-% \let\caps\SOUL@@@X
-% \let\textcaps\SOUL@@@X
-% \let\ul\SOUL@@@X
-% \let\textul\SOUL@@@X
-% \let\st\SOUL@@@X
-% \let\textst\SOUL@@@X
-% \let\hl\SOUL@@@X
-% \let\texthl\SOUL@@@X
-% \let\sy\SOUL@@@X
-% \let\an\SOUL@@@X
-% \let\magstylepar\SOUL@@@X
-% \let\sloppyword\SOUL@@@X
-% \def\sodef#1#2#3#4{\let#1\relax\SOUL@@@X}%
-% \fi
-%
-% \newcommand*\xpath{^^A
-% \bgroup
-% \let\do\@makeother
-% \dospecials
-% \catcode`\{=1
-% \catcode`\}=2
-% \def\{{\char"7B}^^A
-% \def\}{\char"7D}^^A
-% \SOUL@@@code
-% }
-%
-% \newcommand*\SOUL@@@code[1]{\normalfont\texttt{#1}\egroup}
-%
-% \let\cs\xpath
-% \let\option\textsf
-% \def\package#1{{\normalfont\texttt{#1}}}
-% \let\program\texttt
-% \let\bibtitle\textit
-% \let\syn\textit
-%
-% \sodef\person{\scshape}{0.06em}{0.45em}{0.4em}
-% \sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}
-% \DeclareRobustCommand*\versal[1]{^^A
-% \MakeUppercase{\SOUL@@@versal{#1}}^^A
-% }
-%
-% \def\ConTeXt{Con\TeX t}
-% \def\CTAN{{\small\caps{CTAN}}}
-% \def\soul{\package{soul}}
-%
-% ^^A set some parameters as used in Plain TeX
-% \def\plainsetup{^^A
-% \pretolerance100
-% \tolerance200
-% \hbadness1000
-% \linepenalty10
-% \hyphenpenalty50
-% \exhyphenpenalty50
-% \doublehyphendemerits10000
-% \finalhyphendemerits5000
-% \adjdemerits10000
-% \hfuzz.1pt
-% \overfullrule5pt
-% }
-%
-% \def\FIXME#1{\message{<FIXME>}#1}
-%
-% \makeatother
-%
-%
-% \lefthyphenmin2
-% \righthyphenmin3
-% \hyphenation{Le-se-ty-po-gra-phie Ver-bin-dung fak-si-mi-le}
-%
-%
-%^^A=====================================================
-%
-%
-% \changes{v1.0}{1998/10/16}{Initial version}%
-%^^A due to an error in the documentation of v1.0, there's no v1.1 :-(
-% \changes{v1.1a}{1998/12/08}{fixed a bunch of bugs; `magstylepar command
-% banned; `caps introduced; `so and `caps recognize following spaces;
-% error message added; `so parameters are mandatory}
-%
-% \changes{v1.2}{1999/01/11}{fixed the newline bug; added the `\(>\) command}
-%
-% \changes{v1.3}{1999/05/15}{changed allowhyphen, preambles; added a paragraph
-% in the `features' section}
-%
-% \changes{v2.0}{2002/01/03}{(almost) complete rewrite}
-%
-% \changes{v2.1}{2002/01/10}{Happy (64th) birthday, Don!
-% ``The now-traditional fix for the
-% now-traditional brown-paper-bag major release.''
-% as Eric S. RAYMOND commented on his CML2.0.1 release. ;-)}
-%
-% \changes{v2.2}{2002/05/12}{fixed a couple of bugs; added support for
-% the Plain TeX color.sty wrapper}
-%
-% \changes{v2.3}{2002/05/29}{compatibility with cmbright/ccfonts}
-%
-% \changes{v2.4}{2003/11/17}{Fix the font bug. Fix a scanner bug.
-% Other bugfixes; change caps set handling; add footnote and
-% textsuperscript support}
-%
-%
-%
-%
+% \title{The \xpackage{soul} package}
+% \date{2023-02-18 v3.0}
+% \author{Heiko Oberdiek\thanks
+% {Please report any issues at \url{https://github.com/ho-tex/soul/issues}}}
%
% \maketitle
%
-%
-%
% \begin{abstract}
-% This article describes the \soul\ package^^A
-%^^A%%
-% \footnote{This file has version number \fileversion, last revised \filedate.},
-%^^A%%
-% which provides \so{hyphenatable letterspacing (spacing out),} \ul{underlining}
-% and some derivatives such as \st{overstriking} and highlighting.
-% Although the package is optimized for \LaTeXe, it also works with
-% Plain \TeX\ and with other flavors of \TeX\ like, for instance, \ConTeXt.
-% By the way, the package name |soul| is only a combination
-% of the two macro names \cs{\so} (space out) and \cs{\ul}
-% (underline)---nothing poetic at all.^^A :-(
+% This version is a merge of the original
+% package \xpackage{soul} (version 2.5 which contains some small corrections compared to the
+% version 2.4 from 2003)
+% and the \xpackage{soulutf8} which added some support
+% for UTF-8. Namely the input encodings \xfile{utf8.def}
+% from package \xpackage{inputenc} and
+% package \xpackage{ucs}'s \xfile{utf8x.def} are supported.
+% The original \xpackage{soul} package has been renamed to \xpackage{soul-ori} and is still loaded.
+% Its documentation is still relevant.
% \end{abstract}
%
-%
-% {\setlength\parskip{0pt}\tableofcontents }
-% \addtocontents{toc}{\protect\begin{multicols}{2}}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Typesetting rules}
-% \label{sec:typesetting}
-%
-% There are several possibilities to emphasize parts of a paragraph,
-% not all of which are considered good style. While underlining
-% is commonly rejected, experts dispute about whether letterspacing
-% should be used or not, and in which cases. If you are not interested
-% in such debates, you may well skip to the next section.
-%
-%
-% \subsection*{Theory \dots}
-% \label{sec:theory}
-%
-% To understand the experts' arguments we have to know about the
-% conception of \emph{page grayness.} The sum of all characters on
-% a page represents a certain amount of grayness, provided that
-% the letters are printed black onto white paper.
-%
-% \person{Jan Tschichold} \cite{Tschichold}, a well known and recognized
-% typographer, accepts only forms of emphasizing, which do not disturb this
-% grayness. This is only true of italic shape, caps, and
-% caps-and-small-caps fonts, but not of ordinary letterspacing, underlining,
-% bold face type and so on, all of which appear as either dark or light
-% spots in the text area. In his opinion emphasized text shall not catch the eye when
-% running over the text, but rather when actually reading the respective words.
-%
-% Other, less restrictive typographers \cite{Willberg} call this kind of emphasizing
-% `integrated' or `aesthetic', while they describe `active' emphasizing apart from it,
-% which actually \emph{has} to catch the reader's eye. To the latter group belong commonly
-% despised things like letterspacing, demibold face type and even underlined and colored text.
-%
-% On the other hand, \person{Tschichold} suggests
-% to space out caps and caps-and-small-caps fonts on title pages, headings and running headers from
-% 1\,pt up to 2\,pt.
-% Even in running text legibility of uppercase letters should be improved with slight
-% letterspacing, since (the Roman) majuscules don't look right, if they are spaced
-% like (the Carolingian) minuscules.\footnote{This suggestion is followed throughout this article,
-% although Prof.~\person{Knuth} already considered slight letterspacing with his |cmcsc| fonts.}
-%
-%
-%
-%\subsection*{\dots\ and Practice}
-%
-% However, in the last centuries letterspacing was excessively used,
-% underlining at least sometimes, because capitals and italic shape could
-% not be used together with the \emph{Fraktur} font and other black-letter fonts,
-% which are sometimes also called ``old German'' fonts.
-% This tradition is widely continued until today. The same limitations apply still today
-% to many languages with non-latin glyphs, which is why letterspacing has a strong
-% tradition in eastern countries where Cyrillic fonts are used.
-%
-% The \person{Duden} \cite{Duden}, a well known German dictionary, explains how to space out properly:
-% \emph{Punctuation marks are spaced out like letters, except quotation marks and periods.
-% Numbers are never spaced out. The German syllable \mbox{\emph{-sche}} is not spaced
-% out in cases like \emph{``der {\so{Virchow{sche}}} Versuch''}\footnote{the \person{Virchow} experiment}.
-% In the old German \emph{Fraktur} fonts the ligatures \emph{|ch|, |ck|, |sz|~(\ss)} and~\emph{|tz|} are
-% not broken within spaced out text.}
-%
-% While some books follow all these rules \cite{Muszynski}, others don't
-% \cite{Reglement}. In fact, most books in my personal library do \emph{not} space out commas.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Short introduction and common rules}
-%
-% The \soul\ package provides five commands that are aimed at emphasizing
-% text parts. Each of the commands takes one argument that can either be
-% the text itself or the name of a macro that contains text (e.\,g.~|\so\text|)^^A
-% ^^A
-% \footnote{See~\ref{par:Unexpandable material in command sequences} for
-% some additional information about the latter mode.}^^A
-% ^^A
-% .
-% See table~\ref{tab:survey} for a complete command survey.
-%
-% {\catcode`\|=12
-% \begin{center}
-% \begin{tabular}{r@{\hspace{1.5em}}l}
-% \verb+\so{letterspacing}+&\so{letterspacing}\\
-% \verb+\caps{CAPITALS, Small Capitals}+&\caps{CAPITALS, Small Capitals}\\
-% \verb+\ul{underlining}+&\ul{underlining}\\
-% \verb+\st{overstriking}+&\st{overstriking}\\
-% \verb+\hl{highlighting}+&highlighting\footnotemark\\
-% \end{tabular}
-% \end{center}
-% \footnotetext{The look of highlighting is nowhere demonstrated
-% in this documentation, because it requires a Postscript aware
-% output driver and would come out as ugly black bars on other
-% devices, looking very much like censoring bars. Think of it as
-% the effect of one of those coloring text markers.}
-% }
-%
-% \noindent
-% The \cs{\hl} command does only highlight if the \package{color} package
-% was loaded, otherwise it falls back to underlining.\footnote{Note that
-% you can also use \LaTeX's \package{color} package with Plain \TeX.
-% See~\ref{sec:plain} for details.} The highlighting
-% color is by default yellow, underlines and overstriking lines are by
-% default black. The colors can be changed using the following commands:
-%
-% {\catcode`\|=12
-% \begin{center}
-% \begin{tabular}{r@{\hspace{1.5em}}l}
-% \verb+\setulcolor{red}+&set underlining color\\
-% \verb+\setstcolor{green}+&set overstriking color\\
-% \verb+\sethlcolor{blue}+&set highlighting color\\
-% \end{tabular}
-% \end{center}
-% }
-%
-% \noindent
-% |\setulcolor{}| and |\setstcolor{}| turn coloring off.
-% There are only few colors predefined by the \package{color}
-% package, but you can easily add custom color definitions.
-% See the \package{color} package documentation~\cite{color} for further
-% information.
-%
-% \begin{example}
-% |\usepackage{color,soul}|\\
-% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
-% |\sethlcolor{lightblue}|\\
-% |...|\\
-% |\hl{this is highlighted in light blue color}|\\
-% \end{example}
-%
-%
-%
-%
-%
-%
-%
-% \subsection[Some things work]{Some things work \dots}
-%
-% The following examples may look boring and redundant, because they describe
-% nothing else than common \LaTeX\ notation with a few exceptions, but this is
-% only the half story: The \soul\ package has to pre-process the argument
-% before it can split it into characters and syllables, and all described
-% constructs are only allowed because the package explicitly implements them.
-%
-% \begin{verblist}{1}
-% \item[Accents: \so{na\"\i ve}]
-% Accents can be used naturally.
-% Support for the following accents is built-in: |\`|, |\'|, |\^|, |\"|, |\~|,
-% |\=|, |\.|, |\u|, |\v|, |\H|, |\t|, |\c|, |\d|, |\b|, and |\r|. Additionally,
-% if the \package{german} package \cite{german} is loaded you can also use the |"|
-% accent command and write |\so{na"ive}|. See section~\ref{sec:soulaccent} for how to add
-% further accents.
-% \item[Quotes: \so{``quotes''}]
-% The \soul\ package recognizes the quotes ligatures |``|, |''| and |,,|.
-% The Spanish ligatures |!`| and |?`| are not recognized and have, thus,
-% to be written enclosed in braces like in |\caps{{!`}Hola!}|.
-% \item[Mathematics: \so{foo$x^3$bar}]
-% Mathematic formulas are allowed, as long as they are
-% surrounded by~\texttt\$. Note that the \LaTeX\
-% equivalent |\(...\)| does not work.
-% \item[Hyphens and dashes: \so{re-sent}]
-% Explicit hyphens as well as en-dashes~(|--|), em-dashes~(|---|)
-% and the |\slash| command work as usual.
-% \item[Newlines: \so{new\\line}]
-% The |\\|~command fills the current line with white space
-% and starts a new line. Spaces or linebreaks afterwards are ignored.
-% Unlike the original \LaTeX\ command \soul's version does not handle
-% optional parameters like in |\\*[1ex]|.
-% \item[Breaking lines: \so{foo\linebreak bar}]
-% The \cs{\linebreak} command breaks the line without
-% filling it with white space at the end. \soul's version
-% does not handle optional parameters like in |\linebreak[1]|.
-% \cs{\break} can be used as a synonym.
-% \item[Unbreakable spaces: \so{don't~break}]
-% The |~|~command sets an unbreakable space.
-% \item[Grouping: \so{Virchow{sche}}]
-% A pair of braces can be used to let a group of characters
-% be seen as one entity, so that \soul\ does
-% for instance not space it out. The contents must, however,
-% not contain potential hyphenation points. (See~\ref{par:Protecting})
-% \item[Protecting: \so{foo \mbox{little} bar}]
-% An \cs{\mbox} also lets \soul\ see the contents as one
-% item, but these may even contain hyphenation points. \cs{\hbox} can
-% be used as a synonym.
-% \item[Omitting: \so{\soulomit{foo}}]
-% The contents of \cs{\soulomit} bypass the soul core and are typeset
-% as is, without being letterspaced or underlined. Hyphenation points are
-% allowed within the argument. The current font remains active, but can be
-% overridden with \cs{\normalfont} etc.
-% \item[Font switching commands: \so{foo \texttt{bar}}]
-% All standard \TeX\ and \LaTeX\ font switching commands are allowed, as
-% well as the \package{yfonts} package \cite{yfonts} font commands like \cs{\textfrak} etc.
-% Further commands have to be registered using the \cs{\soulregister}
-% command (see section~\ref{sec:soulregister}).
-% \item[Breaking up ligatures: \ul{Auf{}lage}]
-% Use |{}| or \cs{\null} to break up ligatures like `fl' in \cs{\ul}, \cs{\st} and \cs{\hl}
-% arguments.
-% This doesn't make sense for \cs{\so} and \cs{\caps}, though, because they break up
-% every unprotected (ungrouped\slash unboxed) ligature, anyway, and would
-% then just add undesirable extra space around the additional item.
-% \end{verblist}
-%
-%
-%
-%
-% \subsection{\texorpdfstring{\dots\ }{... }others don't}
-%
-% Although the new \soul\ is much more robust and forgiving than
-% versions prior to~2.0, there are
-% still some things that are not allowed in arguments.
-% This is due to the complex engine, which has to read and inspect every
-% character before it can hand it over to \TeX's paragraph builder.
-%
-% \begin{verblist}{20}
-% \item[Grouping hyphenatable material: \so{foo {little} bar}]
-% Grouped characters must not contain hyphenation points. Instead of
-% |\so{foo {little}}| write |\so{foo \mbox{little}}|. You get a
-% \texttt{`Re\-con\-struction failed'} error and a black square like
-% \errsquare\ in the \caps{DVI} file where you violated this rule.
-% \item[Discretionary hyphens: \so{Zu\discretionary{k-}{}{c}ker}]
-% The argument must not contain discretionary hyphens. Thus, you have to
-% handle cases like the German word |Zu\discretionary{k-}{}{c}ker| by yourself.
-% \item[Nested soul commands: \ul{foo \so{bar} baz}]
-% \soul\ commands must not be nested. If you really
-% need such, put the inner stuff in a box and use this box. It will, of
-% course, not get broken then.\\
-% \null\qquad|\newbox\anyboxname|\\
-% \null\qquad|\sbox\anyboxname{ \so{the worst} }|\\
-% \null\qquad|\ul{This is by far{\usebox\anyboxname}example!}|\\
-% yields:\\
-% \newbox\anyboxname
-% \sbox\anyboxname{ \so{the worst} }
-% \null\qquad\ul{This is by far{\usebox\anyboxname}example!}
-% \item[Leaking font switches: \def\foo{\bf bar} \so{\foo baz}]
-% A hidden font switching command that leaks into its neighborship
-% causes a \texttt{`Reconstruction failed'} error. To avoid this either
-% register the `container' (|\soulregister{\foo}{0}|), or limit its
-% scope as in |\def\foo{{\bf bar}}|. Note that both
-% solutions yield slightly different results.
-% \item[Material that needs expansion: \so{\romannumeral\year}]
-% In this example \cs{\so} would try to put space between \cs{\romannumeral}
-% and \cs{\year}, which can, of course, not work.
-% You have to expand the argument before you feed it to \soul, or even better:
-% Wrap the material up in a command sequence and let \soul\ expand it:
-% |\def\x{\romannumeral\year}| |\so\x|. \soul\ tries hard to expand
-% enough, yet not too much.
-% \item[Unexpandable material in command sequences: \def\foo{\bar} \so\foo]
-% Some macros might not be expandable in an \cs{\edef} definition^^A
-% \footnote{Try \texttt{\string\edef\string\x\char`\{\string\copyright\char`\}}.
-% Yet \texttt{\string\copyright} works in \soul\ arguments, because it is
-% explicitly taken care of by the package}
-% and have to be protected with \cs{\noexpand} in front. This is automatically done
-% for the following tokens: |~|, \cs{\,}, \cs{\TeX}, \cs{\LaTeX},
-% \cs{\S}, \cs{\slash}, \cs{\textregistered}, \cs{\textcircled}, and \cs{\copyright},
-% as well as for all registered fonts and accents. Instead of putting \cs{\noexpand}
-% manually in front of such commands, as in |\def\foo{foo {\noexpand\bar} bar}| |\so\foo|,
-% you can also register them as special (see section \ref{sec:soulregister}).
-% \item[Other weird stuff: \so{foo \verb|\bar| baz}]
-% \soul\ arguments must not contain \LaTeX\ environments, command definitions,
-% and fancy stuff like |\vadjust|. \soul's |\footnote| command replacement
-% does not support optional arguments. As long as you are writing simple,
-% ordinary `horizontal' material, you are on the safe side.
-% \end{verblist}
-%
-%
-%
-%
-%
-%
-%
-% \begin{table}
-% \begin{center}
-% \catcode`\|=12
-% \newcommand*\pref[1]{{\footnotesize\pageref{cmd:#1}}}
-% \newcommand*\Ast{\rlap{$^\ast$}}
-% \let\m\cs
-% \let\ti\textit
-% \begin{tabular}{r@{\hspace{.6em}}c@{\hspace{.6em}}l}
-% &\hbox to0pt{\hss\footnotesize page\hss}&\\[.5ex]
-% \verb+\so{letterspacing}+& \pref{so} &\so{letterspacing}\\
-% \verb+\caps{CAPITALS, Small Capitals}+& \pref{caps} &\caps{CAPITALS, Small Capitals}\\
-% \verb+\ul{underlining}+& \pref{ul} &\ul{underlining}\\
-% \verb+\st{striking out}+& \pref{st} &\st{striking out}\\
-% \verb+\hl{highlighting}+& \pref{hl} &highlighting\\
-% \\
-% \verb+\soulaccent{\cs}+& \pref{soulaccent} &\ti{add accent} \cs{\cs} \ti{to accent list}\\
-% \verb+\soulregister{\cs}{0}+& \pref{soulregister} &\ti{register command} \m{\cs}\\
-% \verb+\sloppyword{text}+& \pref{sloppyword} &\ti{typeset} \m{text} \ti{with stretchable spaces}\\
-% \\
-% \verb+\sodef\cs{1em}{2em}{3em}+& \pref{sodef} &\ti{define new spacing command} \m{\cs}\\
-% \verb+\resetso+& \pref{resetso} &\ti{reset} \m{\so} \ti{dimensions}\\
-% \verb+\capsdef{////}{1em}{2em}{3em}+\Ast& \pref{capsdef} &\ti{define (default)} \m{\caps} \ti{data entry}\\
-% \verb+\capssave{name}+\Ast& \pref{capssave} &\ti{save} \m{\caps} \ti{database under name} \rlap{\texttt{name}}\\
-% \verb+\capsselect{name}+\Ast& \pref{capssave} &\ti{restore} \m{\caps} \ti{database of name} \rlap{\texttt{name}}\\
-% \verb+\capsreset+\Ast& \pref{capsreset} &\ti{clear caps database}\\
-% \verb+\setul{1ex}{2ex}+& \pref{setul} &\ti{set} \m{\ul} \ti{dimensions}\\
-% \verb+\resetul+& \pref{resetul} &\ti{reset} \m{\ul} \ti{dimensions}\\
-% \verb+\setuldepth{y}+& \pref{setuldepth} &\ti{set underline depth to depth of an} y\\
-% \verb+\setuloverlap{1pt}+& \pref{setuloverlap} &\ti{set underline overlap width}\\
-% \verb+\setulcolor{red}+& \pref{setulcolor} &\ti{set underline color}\\
-% \verb+\setstcolor{green}+& \pref{setstcolor} &\ti{set overstriking color}\\
-% \verb+\sethlcolor{blue}+& \pref{sethlcolor} &\ti{set highlighting color}\\
-% \end{tabular}
-% \caption{List of all available commands. The number points to the
-% page where the command is described. Those marked
-% with a little asterisk are only available when the package
-% is used together with \LaTeX, because they rely on the
-% \emph{New Font Selection Scheme (NFSS)} used in \LaTeX.}
-% \label{tab:survey}
-% \end{center}
-% \end{table}
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Troubleshooting}
-%
-% Unfortunately, there's just one helpful error message provided by
-% the \soul\ package, that actually describes the underlying problem. All other
-% messages are generated directly by \TeX\ and show the low-level
-% commands that \TeX\ wasn't happy with. They'll hardly point you
-% to the violated rule as described in the paragraphs above.
-% If you get such a mysterious error message for a line that contains
-% a \soul\ statement, then comment that statement out and see if the message
-% still appears.
-% \texttt{`Incomplete }\cs{\ifcat}\texttt{'} is such a non-obvious message.
-% If the message doesn't appear now, then check the argument for
-% violations of the rules as listed in~\S\S\,20--26.
-%
-%
-%
-% \subsubsection{\texttt{`Reconstruction failed'}}
-%
-% This message appears, if \ref{par:Grouping hyphenatable material} or
-% \ref{par:Leaking font switches} was
-% violated. It is caused by the fact that the reconstruction pass
-% couldn't collect tokens with an overall width of the syllable that
-% was measured by the analyzer. This does either occur when you
-% grouped hyphenatable text or used an unregistered command
-% that influences the syllable width. Font switching commands belong
-% to the latter group. See the above cited sections for how to fix
-% these problems.
-%
-%
-%
-% \subsubsection{Missing characters}
-%
-% If you have redefined the internal font as described in section \ref{sec:internalfont},
-% you may notice that some characters are omitted without any error message
-% being shown. This happens if you have chosen, let's say, a font with
-% only 128~characters like the |cmtt10| font, but are using characters
-% that aren't represented in this font, e.\,g.~characters with codes
-% greater than~127.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{\texorpdfstring{\so{Letterspacing}}{Letterspacing}}
-%
-% \subsection{How it works}
-% \label{sec:so}
-%
-% The base macro for letterspacing is called \describemacro{\so}.
-% It typesets the given argument with \syn{inter-letter space}
-% between every two characters, \syn{inner space} between words
-% and \syn{outer space} before and after the spaced out text.
-% If we let ``$\cdot$'' stand for \syn{inter-letter space}, ``$\ast$''
-% for \syn{inner spaces} and ``$\bullet$'' for \syn{outer
-% spaces,} then the input on the left side of the following table
-% will yield the schematic output on the right side:
-%
-% \begin{center}
-% \def\.{$\cdot$}
-% \def\-{\kern1pt$\ast$\kern1pt}
-% \def\*{$\bullet$}
-% \def\_{\texttt{\char"20}}
-% \begin{tabular}{ccc}
-% 1.& \verb*|XX\so{aaa bbb ccc}YY|& \textsf{XXa\.a\.a\-b\.b\.b\-c\.c\.cYY}\\
-% 2.& \verb*|XX \so{aaa bbb ccc} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
-% 3.& \verb*|XX {\so{aaa bbb ccc}} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
-% 4.& \verb*|XX \null{\so{aaa bbb ccc}}{} YY|& \textsf{XX\_a\.a\.a\-b\.b\.b\-c\.c\.c\_YY}\\
-% \end{tabular}
-% \end{center}
-% ^^A* % fool vim (fixes syntax highlighting)
-%
-% \noindent
-% Case~1 shows how letterspacing macros (\cs{\so} and \cs{\caps}) behave if
-% they aren't following or followed by a space: they omit outer space around
-% the \soul\ statement. Case~2 is what you'll mostly need---letterspaced
-% text amidst running text. Following and leading space get replaced by
-% \syn{outer space}. It doesn't matter if there are opening braces before
-% or closing braces afterwards. \soul\ can see through both of them (case~3).
-% Note that leading space has to be at least |5sp| wide to be recognized as
-% space, because \LaTeX\ uses tiny spaces generated by |\hskip1sp| as marker.
-% Case~4 shows how to enforce normal spaces instead of \syn{outer spaces:}
-% Preceding space can be hidden by |\kern0pt| or \cs{\null} or any character.
-% Following space can also be hidden by any token, but note that a typical macro name
-% like \cs{\relax} or \cs{\null} would also hide the space thereafter.
-%
-%
-% The values are predefined for typesetting facsimiles mainly with
-% \emph{Fraktur} fonts.
-% You can define your own spacing
-% macros or overwrite the original \cs{\so} meaning using the macro
-% \describemacro{\sodef}:
-%
-% \begin{syntax}
-% |\sodef|\<cmd>|{|\<font>|}{|\<inter-letter space>|}{|\<inner space>|}{|\<outer space>|}|
-% \end{syntax}
-%
-% The space dimensions, all of which are mandatory, should be defined in terms of |em|
-% letting them grow and shrink with the respective fonts.
-%
-% \begin{example}
-% |\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}|
-% \end{example}
-%
-% After that you can type `|\an{example}|' to get
-% {\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}^^A
-% `\an{example}'.}
-% The \describemacro{\resetso} command resets \cs{\so}
-% to the default values.
-%
-%
-%
-%
-% \subsection{Some examples}
-%
-%^^A=====================================================
-% \begin{examples}
-%
-% \soultest{Ordinary text}
-% |\so{electrical industry}|
-% {\so{electrical industry}}
-%
-% \soultest{Use \texttt{\string\-} to mark hyphenation points}
-% |\so{man\-u\-script}|
-% {\so{man\-u\-script}}
-%
-% \soultest{Accents are recognized}
-% |\so{le th\'e\^atre}|
-% {\so{le th\'e\^atre}}
-%
-% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
-% contains hyphenation points. The contents are treated as one, unbreakable entity}
-% |\so{just an \mbox{example}}|
-% {\so{just an \mbox{example}}}
-%
-% \soultest{Punctuation marks are spaced out, if they are
-% put into the group}
-% |\so{inside.} \& \so{outside}.|
-% {\so{inside.} \& \so{outside}.}
-%
-% \soultest{Space-out skips may be removed by typing \texttt{\string\<}.
-% It's, however, desirable to put the quotation marks out of
-% the argument}
-% |\so{``\<Pennsylvania\<''}|
-% {\so{``\<Pennsylvania\<''}}
-%
-% \soultest{Numbers should never be spaced out}
-% |\so{1\<3 December {1995}}|
-% {\so{1\<3 December {1995}}}
-%
-% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
-% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
-% afterwards}
-% |\so{input\slash output}|
-% {\so{input\slash output}}
-%
-% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
-% you have to protect the hyphen. This is no \soul\ restriction
-% but normal \TeX\ behavior}
-% |\so{\dots and \mbox{-}jet}|
-% {\so{\dots and \mbox{-}jet}}
-%
-% \soultest{The \texttt{\~} command inhibits line breaks}
-% |\so{unbreakable~space}|
-% {\so{unbreakable~space}}
-%
-% \soultest{\texttt{\string\\} works as usual. Additional arguments
-% like \texttt{*} or vertical space are not accepted, though}
-% |\so{broken\\line}|
-% {\so{broken\\line}}
-%
-% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
-% |\so{pretty awful\break test}|
-% {\so{pretty awful\break test}}
-%
-% \end{examples}
-%^^A=====================================================
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection[Typesetting \texorpdfstring{\caps{caps-and-small-caps}}{caps-and-small-caps} fonts]
-% {Typesetting capitals-and-small-capitals fonts}
-%
-% There is a special letterspacing command called \describemacro{\caps},
-% which differs from \cs{\so} in that it switches to caps-and-small-caps
-% font shape, defines only slight spacing and is able to select spacing
-% value sets from a database. This is a requirement for high-quality
-% typesetting \cite{Tschichold}. The following lines show the effect
-% of \cs{\caps} in comparison with the normal textfont and with
-% small-capitals shape:
-%
-% \def\sampletext{DONAUDAMPFSCHIFFAHRTSGESELLSCHAFT}
-% \medskip\noindent
-% \begin{tabular}{rl}
-% |\normalfont|&\sampletext\\
-% |\scshape|&{\scshape\sampletext}\\
-% |\caps|&\caps\sampletext\\
-% ^^A|\person|&\person\sampletext\\
-% \end{tabular}
-%
-% \medbreak\noindent
-% The \cs{\caps} font database is by default empty, i.\,e., it contains
-% just a single default entry, which yields the result as shown in the
-% example above.
-% New font entries may be added \emph{on top} of this list using the \describemacro{\capsdef}
-% command, which takes five arguments: The first argument describes the font with
-% \emph{encoding, family, series, shape,} and \emph{size,}^^A
-% \footnote{as defined by the \caps{NFSS}, the ``New Font Selection Scheme''}
-% each optionally
-% (e.\,g.~|OT1/cmr/m/n/10| for this very font, or only |/ppl///12| for all
-% \emph{palatino} fonts at size 12\,pt). The \emph{size} entry may also contain
-% a size range (\texttt{5-10}), where zero is assumed for an omitted lower
-% boundary (\texttt{-10}) and a very, very big number for an omitted upper
-% boundary (\texttt{5-}). The
-% upper boundary is not included in the range, so, in the example below, all
-% fonts with sizes greater or equal 5\,pt and smaller than 15\,pt are accepted
-% ($5\,\mbox{pt}\le size<15\,\mbox{pt}$).
-% The second argument may contain font switching commands such as \cs{\scshape},
-% it may as well be empty or contain debugging commands (e.\,g.~|\message{*}|).
-% The remaining three, mandatory arguments are the spaces as described in
-% section~\ref{sec:so}.
-%
-% \begin{example}
-% |\capsdef{T1/ppl/m/n/5-15}{\scshape}{.16em}{.4em}{.2em}|
-% \end{example}
-%
-% The \cs{\caps} command goes through the data list from top to bottom
-% and picks up the first matching set, so the order of definition is essential.
-% The last added entry is examined first, while the pre-defined default entry
-% will be examined last and will match any font, if no entry was taken before.
-%
-% To override the default values, just define a new default entry using
-% the identifier |{////}|. This entry should be defined first, because no
-% entry after it can be reached.
-%
-% The \cs{\caps} database can be cleared with the \describemacro{\capsreset}
-% command and will only contain the default entry thereafter. The
-% \describemacro{\capssave} command saves the whole current database
-% under the given name. \describemacro{\capsselect} restores such a database.
-% This allows to predefine different groups of \cs{\caps} data sets:
-%
-% \begin{example}
-% |\capsreset|\\
-% |\capsdef{/cmss///12}{}{12pt}{23pt}{34pt}|\\
-% |\capsdef{/cmss///}{}{1em}{2em}{3em}|\\
-% |...|\\
-% |\capssave{wide}|\\
-% \end{example}
-% \indent
-% \begin{example}
-% |%---------------------------------------|\\
-% |\capsreset|\\
-% |\capsdef{/cmss///}{}{.1em}{.2em}{.3em}|\\
-% |...|\\
-% |\capssave{narrow}|\\
-% \end{example}
-% \indent
-% \begin{example}
-% |%---------------------------------------|\\
-% |{\capsselect{wide}|\\
-% |\title{\caps{Yet Another Silly Example}}|\\
-% |}|\\
-% \end{example}
-%
-% See the `|example.cfg|' file for a detailed example.
-% If you have defined a bunch of sets for different fonts and sizes,
-% you may lose control over what fonts are used by the package. With the
-% package option \DescribeOption{capsdefault}\option{capsdefault} selected,
-% \cs{\caps} prints its argument underlined, if no set was specified for a
-% particular font and the default set had to be used.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Typesetting Fraktur}
-% \label{sec:fraktur}
-%
-% Black letter fonts^^A
-%^^A%%
-% \footnote{See the great black letter fonts, which \person{Yannis Haralambous}
-% kindly provided, and the \package{oldgerm} and \package{yfonts} package~\cite{yfonts}
-% as their \LaTeX\ interfaces.}
-%^^A%%
-% deserve some additional considerations. As stated in section~\ref{sec:typesetting},
-% the ligatures |ch|, |ck|, |sz|~(\cs{\ss}), and~|tz| have to remain unbroken in spaced out
-% \emph{Fraktur} text. This may look strange at first glance, but you'll get used to it:
-%
-% \begin{example}
-% |\textfrak{\so{S{ch}u{tz}vorri{ch}tung}}|
-% \end{example}
-%
-% You already know that grouping keeps the |soul| mechanism from separating such ligatures.
-% This is quite important for |s:|, |a*|, and~|"a|. As hyphenation is stronger than
-% grouping, especially the |sz| may cause an error, if hyphenation happens to occur between
-% the letters |s| and~|z|. (\TeX\ hyphenates the German word |auszer| wrongly like
-% |aus-zer| instead of like |au-szer|, because the German hyphenation patterns
-% do, for good reason, not see |sz| as `\cs{\ss}'.) In such cases you can protect tokens with the
-% sequence e.\,g.~|\mbox{sz}| or a properly defined command. The \cs{\ss} command,
-% which is defined by the \package{yfonts} package, and similar commands will suffice as well.
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Dirty tricks}
-% \label{sec:dirtytricks}
-%
-% Narrow columns are hard to set, because they don't allow much spacing
-% flexibility, hence long words often cause overfull boxes. A macro
-% could use \cs{\so} to insert stretchability between the single
-% characters. Table~\ref{tab:dirtytricks} shows some text typeset with such
-% a macro at the left side and under \emph{plain} conditions at
-% the right side, both with a width of~6\,pc.
-%
-% \def\sampletext{Some magazines and newspapers prefer this kind of spacing
-% because it reduces hyphenation problems to a minimum\<. Unfortunately\<, such
-% paragraphs aren't especially beautiful\<.}
-% \newbox\dirtytrick
-% \setbox\dirtytrick\vbox{
-% \batchmode ^^A we don't want to see all these overfull boxes ...
-% \leavevmode\hspace{0ptplus1fil}
-% \hbox{\parindent0pt\plainsetup\let\<\relax
-% \vtop{\hsize6pc\raggedright\sampletext}\hskip1em
-% \vtop{\hsize6pc\magstylepar\sampletext}\hskip1em
-% \vtop{\hsize6pc\sampletext}\hss}
-% \errorstopmode}
-%
-% \begin{table}
-% \begin{center}
-% \overfullrule5pt
-% \usebox\dirtytrick
-% \caption{Ragged-right, magazine style (using \soul), and block-aligned
-% in comparison. But, frankly, none of them is really acceptable.
-% (Don't do this at home, children!)}
-% \label{tab:dirtytricks}
-% \end{center}
-% \end{table}
-%
-%
-%
-%
-%
-%
-%
-% \section{\texorpdfstring{\ul{Underlining}}{Underlining}}
-%
-% The underlining macros are my answer to Prof.~\person{Knuth'{\normalfont s}}
-% exercise 18.26 from his \TeX{}book~\cite{DEK}. \texttt{:-)} Most of what
-% is said about the macro \describemacro{\ul} is also true of the
-% striking out macro \describemacro{\st} and the highlighting macro \describemacro{\hl},
-% both of which are in fact derived from the former.
-%
-%
-%
-%
-% \subsection{Settings}
-%
-% \subsubsection{Underline depth and thickness}
-%
-% The predefined \syn{underline depth} and \syn{thickness}
-% work well with most fonts. They can be changed using the macro \describemacro{\setul}.
-%
-% \begin{syntax}
-% |\setul{|\<underline depth>|}{|\<underline thickness>|}|
-% \end{syntax}
-%
-% Either dimension can be omitted, in which case there has to be
-% an empty pair of braces.
-% Both values should be defined in terms of |ex|, letting them
-% grow and shrink with the respective fonts.
-% The \describemacro{\resetul} command restores the standard values.
-%
-% Another way to set the \syn{underline depth} is to use the macro
-% \describemacro{\setuldepth}. It sets the depth such that the
-% underline's upper edge lies 1\,pt beneath the given argument's
-% deepest depth. If the argument is empty, all
-% letters---i.\,e.\ all characters whose \cs{\catcode} currently
-% equals 11---are taken. Examples:
-%
-% \begin{example}
-% |\setuldepth{ygp}|\\
-% |\setuldepth\strut|\\
-% |\setuldepth{}|\\
-% \end{example}
-%
-%
-%
-% \subsubsection{Line color}
-%
-% The underlines are by default black. The color can be changed by
-% using the \describemacro{\setulcolor} command. It takes one argument that can be any
-% of the color specifiers as described in the |color| package. This package
-% has to be loaded explicitly.
-%
-% \indent
-% \begin{example}
-% |\documentclass{article}|\\
-% |\usepackage{color,soul}|\\
-% |\definecolor{darkblue}{rgb}{0,0,0.5}|\\
-% |\setulcolor{darkblue}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\begin{document}|\\
-% |...|\\
-% |\ul{Cave: remove all the underlines!}|\\
-% |...|\\
-% |\end{document}|\\
-% \end{example}
-%
-%
-% The colors for overstriking lines and highlighting are likewise set
-% with \describemacro{\setstcolor} (default: black) and \describemacro{\sethlcolor}
-% (default: yellow). If the \package{color} package wasn't loaded,
-% underlining and overstriking color are black, while highlighting
-% is replaced by underlining.
-%
-%
-%
-%
-%
-%
-%
-% \subsubsection{The \program{dvips} problem}
-% \label{sec:dvips}
-%
-% \ul{Underlining}, \st{striking out} and highlighting build up
-% their lines with many short line segments. If you used the `\program{dvips}'
-% program with default settings, you would get little gaps on some places, because
-% the \emph{maxdrift} parameter allows the single objects to drift
-% this many pixels from their real positions.
-% \bigbreak
-%
-% \noindent
-% There are two ways to avoid the problem, where the \soul\ package
-% chooses the second by default:
-% \begin{enumerate}
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% This package \xpackage{soul} does not have own options and does not
+% define new user commands.
+% Any option is passed to package \xpackage{soul-ori} \cite{soul}
+% that is loaded first.
+% Then some internal macros of \xpackage{soul-ori} are redefined to add
+% support for UTF-8.
+% The following input encodings are supported:
+% \begin{quote}
+% \begin{tabular}{@{}lll@{}}
+% \texttt{utf8} & \LaTeX\ base &
+% \xfile{TDS:tex/latex/base/utf8.def} \cite{utf8}\\
+% \texttt{utf8x} & Package \xpackage{ucs} &
+% \xfile{TDS:tex/latex/ucs/utf8x.def} \cite{ucs}\\
+% \end{tabular}
+% \end{quote}
+% UTF-8 byte sequences are added as token group to a word, even
+% if these UTF-8 characters are some kind of hyphen or space.
+% As exception the following three Unicode characters are handled specially:
+% \begin{quote}
+% \begin{tabular}{lll}
+% Slot & Name & Action\\
+% \hline
+% \texttt{U+00A0} & NO-BREAK SPACE & like |~|\\
+% \texttt{U+2013} & EN DASH & |--|\\
+% \texttt{U+2014} & EM DASH & |---|
+% \end{tabular}
+%
+% \subsection{Patch}
+%
+% Also package \xpackage{soul} tries to patch package \xpackage{soul-ori}
+% to improve its behaviour:
+% \begin{itemize}
% \item
-% Set the \emph{maxdrift} value to zero, e.\,g.: |dvips -e 0 file.dvi|.
-% This is probably not a good idea, since the letters may then no longer be
-% spaced equally on low resolution printers.
+% A problem with additional levels of curly braces is fixed.
+% As advantage more implicite kernings are detected.
+% However, the result may be incompatible with the
+% original behaviour of package \xpackage{soul-ori} because
+% of these respected implicite kernings.
% \item
-% Let the lines stick out by a certain amount on each side so that they
-% overlap. This overlap amount can be set using the \describemacro{\setuloverlap}
-% command. It is set to 0.25\,pt by default. |\setuloverlap{0pt}| turns overlapping off.
-% \end{enumerate}
-%
-%
-%
-%
-%
-%
-% \subsection{Some examples}
-%
-%^^A=====================================================
-% \begin{examples}
-%
-% \soultest{Ordinary text}
-% |\ul{electrical industry}|
-% {\ul{electrical industry}}
-%
-% \soultest{Use \texttt{\string\-} to mark hyphenation points}
-% |\ul{man\-u\-script}|
-% {\ul{man\-u\-script}}
-%
-% \soultest{Accents are recognized}
-% |\ul{le th\'e\^atre}|
-% {\ul{le th\'e\^atre}}
-%
-% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
-% contains hyphenation points. The contents are treated as one, unbreakable entity}
-% |\ul{just an \mbox{example}}|
-% {\ul{just an \mbox{example}}}
-%
-% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
-% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
-% afterwards}
-% |\ul{input\slash output}|
-% {\ul{input\slash output}}
-%
-% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
-% you have to protect the hyphen. This is no \soul\ restriction
-% but normal \TeX\ behavior}
-% |\ul{\dots and \mbox{-}jet}|
-% {\ul{\dots and \mbox{-}jet}}
-%
-% \soultest{The \texttt{\~} command inhibits line breaks}
-% |\ul{unbreakable~space}|
-% {\ul{unbreakable~space}}
-%
-% \soultest{\texttt{\string\\} works as usual. Additional arguments
-% like \texttt{*} or vertical space are not accepted, though}
-% |\ul{broken\\line}|
-% {\ul{broken\\line}}
-%
-% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
-% |\ul{pretty awful\break test}|
-% {\ul{pretty awful\break test}}
-%
-% \soultest{Italic correction needs to be set manually}
-% |\ul{foo \emph{bar\/} baz}|
-% {\ul{foo \emph{bar\/} baz}}
-%
-% \end{examples}
-%^^A=====================================================
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Customization}
-%
-% \subsection{Adding accents}
-% \label{sec:soulaccent}
-%
-% The \soul\ scanner generally sees every input token separately.
-% It has to be taught that some tokens belong together. For accents this is done
-% by registering them via the \describemacro{\soulaccent} macro.
-%
-% \begin{syntax}
-% |\soulaccent{|\<accent command>|}|
-% \end{syntax}
-%
-% The standard accents, however, are already pre-registered:
-% |\`|, |\'|, |\^|, |\"|, |\~|, |\=|, |\.|, |\u|, |\v|, |\H|, |\t|,
-% |\c|, |\d|, |\b|, and |\r|. If used together with the \package{german}
-% package, \soul\ automatically adds the |"| command.
-% Let's assume you have defined |\%| to put some weird accent on
-% the next character. Simply put the following line into your |soul.cfg|
-% file (see section~\ref{sec:config}):
-%
-% \begin{example}
-% |\soulaccent{\%}|
-% \end{example}
-%
-% Note that active characters like the |"| command have already
-% to be \cs{\active} when they are stored or they won't be recognized
-% later. This can be done temporarily, as in |{\catcode\`"\active\soulaccent{"}}|.
-%
-%
-%
-%
-% \subsection{Adding font commands}
-% \label{sec:soulregister}
-%
-% To convince \soul\ not to feed font switching (or other)
-% commands to the analyzer, but rather to execute them immediately,
-% they have to be registered, too. The \describemacro{\soulregister} macro
-% takes the name of a command name and either |0| or |1| for the number
-% of arguments:
-%
-% \begin{syntax}
-% |\soulregister{|\<command name>|}{|\<number of arguments>|}|
-% \end{syntax}
-%
-% If \cs{\bf} and \cs{\emph} weren't already registered, you would
-% write the following into your |soul.cfg| configuration file:
-%
-% \begin{example}
-% |\soulregister{\bf}{0} % {\bf foo}| \\
-% |\soulregister{\emph}{1} % \emph{bar}|\\
-% \end{example}
-%
+% \eTeX\ , especially \cs{unexpanded} is supported.
+% This allows a better protection of token groups
+% (|\mbox{|\dots|}|, math, \dots).
+% \end{itemize}
+% \end{quote}
%
-% All standard \TeX\ and \LaTeX\ font commands, as well as the
-% \package{yfonts} commands are already pre-registered:
+% \subsection{Future}
%
-% \begin{example}
-% |\em, \rm, \bf, \it, \tt, \sc, \sl, \sf, \emph, \textrm,|\\
-% |\textsf, \texttt, \textmd, \textbf, \textup, \textsl,|\\
-% |\textit, \textsc, \textnormal, \rmfamily, \sffamily,|\\
-% |\ttfamily, \mdseries, \upshape, \slshape, \itshape,|\\
-% |\scshape, \normalfont, \tiny, \scriptsize, \footnotesize,|\\
-% |\small, \normalsize, \large, \Large, \LARGE, \huge, \Huge,|\\
-% |\MakeUppercase, \textsuperscript, \footnote,|\\
-% |\textfrak, \textswab, \textgoth, \frakfamily,|\\
-% |\swabfamily, \gothfamily|\\
-% \end{example}
+% Currently package \xpackage{soul-ori} does not seem to be
+% maintained. Nevertheless if there will be a new version that
+% adds support for UTF-8, then this package may become
+% obsolete.
%
-% You can also register other commands as fonts, so the
-% analyzer won't see them. This may be necessary for some
-% macros that \soul\ refuses to typeset correctly.
-% But note, that \cs{\so} and \cs{\caps} won't put their
-% letter-skips around then.
-%
-%
-%
-%
-%
-%
-% \subsection{Changing the internal font}
-% \label{sec:internalfont}
-%
-% The \soul\ package uses the |ectt1000| font while it analyzes
-% the syllables. This font is used, because it
-% has 256~mono-spaced characters without any kerning.
-% It belongs to \person{J\"org Knappen'\textrm{s}}
-% \caps{EC}-fonts, which should be part of every modern \TeX\ installation.
-% If \TeX\ reports ``\texttt{I can't find file `ectt1000'}'' you don't
-% seem to have this font installed. It is recommended that
-% you install at least the file |ectt1000.tfm| which has less than 1.4\,kB\null.
-% Alternatively, you can let the \soul\ package use the |cmtt10| font that
-% is part of any installation, or some other mono-spaced font:
-%
-% \begin{example}
-% |\font\SOUL@tt=cmtt10|
-% \end{example}
-%
-% Note, however, that \soul\ does only handle characters,
-% for which the internal font has a character with the same
-% character code. As |cmtt10| contains only characters with codes
-% 0 to~127, you can't typeset characters with codes 128 to~255.
-% These 8-bit character codes are used by many fonts with non-ascii
-% glyphs. So the |cmtt10| font will, for example, not work for |T2A|
-% encoded cyrillic characters.
-%
-%
-%
-%
-%
-%
-%
-% \subsection{The configuration file}
-% \label{sec:config}
-%
-% If you want to change the predefined settings or add new features,
-% then create a file named `|soul.cfg|' and put it in a directory, where \TeX\
-% can find it. This configuration file will then be loaded
-% at the end of the |soul.sty| file, so you may redefine
-% any settings or commands therein, select package options and even
-% introduce new ones. But if you intend to give
-% your documents to others, don't forget to give them the
-% required configuration files, too! That's how such a file
-% could look like:
-%
-% \indent
-% \begin{example}
-% |% define macros for logical markup|\\
-% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
-% \\
-% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
-% |\DeclareRobustCommand*\versal[1]{%|\\
-% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
-% |}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |% load the color package and set|\\
-% |% a different highlighting color|\\
-% |\RequirePackage{color}|\\
-% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
-% |\sethlcolor{lightblue}|\\
-% |\endinput|
-% \end{example}
-%
-% You can safely use the |\SOUL@@@| namespace for internal macros---it
-% won't be used by the \soul\ package in the future.
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{Miscellaneous}
-%
-% \subsection{Using \texorpdfstring{\soul\ }{soul }with other flavors of \texorpdfstring{\TeX}{TeX}}
-% \label{sec:plain}
-%
-% This documentation describes how to use \soul\ together
-% with \LaTeXe, for which it is optimized. It works, however, with
-% all other flavors of \TeX, too. There are just some minor restrictions
-% for Non-\LaTeX\ use:
-%
-% The \cs{\caps} command doesn't use a database, it is only a dumb
-% definition with fixed values. It switches to \cs{\capsfont}, which---unless
-% defined explicitly like in the following example---won't really change
-% the used font at all. The commands \cs{\capsreset} and \cs{\capssave}
-% do nothing.
-%
-% \begin{example}
-% |\font\capsfont=cmcsc10|\\
-% |\caps{Tschichold}|\\
-% \end{example}
-%
-% None of the commands are made `robust', so they have to be
-% explicitly protected in fragile environments like in \cs{\write}
-% statements.
-% To make use of colored underlines or highlighting you have to
-% use the \package{color} package wrapper from \caps{CTAN}^^A
-% \footnote{\texttt{CTAN:/macros/plain/graphics/\char`\{miniltx.tex,color.tex\char`\}}},
-% instead of the \package{color} package directly:
-%
-% \begin{example}
-% |\input color|\\
-% |\input soul.sty|\\
-% |\hl{highlighted}|\\
-% |\bye|\\
-% \end{example}
-%
-% The \option{capsdefault} package option is mapped to a simple command
-% \describemacro{\capsdefault}.
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Using \texorpdfstring{\soul\ }{soul }commands for logical markup}
-% \label{sec:markup}
-%
-% It's generally a bad idea to use font style commands like \cs{\textsc}
-% in running text. There should always be some reasoning behind changing
-% the style, such as ``names of persons shall be typeset in a caps-and-small-caps
-% font''. So you declare in your text just that some words are the name of a
-% person, while you define in the preamble or, even better, in a separate
-% style file how to deal with persons:
-%
-% \begin{example}
-% |\newcommand*\person{\textsc}|\\
-% |...|\\
-% |``I think it's a beautiful day to go to the zoo and feed|\\
-% |the ducks. To the lions.'' --~\person{Brian Kantor}|\\
-% \end{example}
-%
-% It's quite simple to use \soul\ commands that way:
-%
-% \begin{example}
-% |\newcommand\comment*{\ul} % or \let\comment=\ul|\\
-% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
-% \end{example}
-%
-% Letterspacing commands like \cs{\so} and \cs{\caps} have to
-% check whether they are followed by white space, in which case
-% they replace that space by \syn{outer space}. Note that \soul\
-% does look through closing braces. Hence you can conveniently bury
-% a \soul\ command within another macro like in the following
-% example. Use any other token to hide following space if necessary,
-% for example the \cs{\null} macro.
-%
-% \begin{example}
-% |\DeclareRobustCommand*\versal[1]{%|\\
-% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
-% |}|\\
-% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
-% \end{example}
-%
-%
-% But what if the \soul\ command is for some reason not the last one
-% in that macro definition and thus cannot look ahead at the following token?
-%
-%
-% \begin{example}
-% |\newcommand*\somsg[1]{\so{#1}\message{#1}}|\\
-% |...|\\
-% |foo \somsg{bar} baz % wrong spacing after `bar'!|\\
-% \end{example}
-%
-% In this case you won't get the following space replaced by \emph{outer space}
-% because when \soul\ tries to look ahead, it only sees the token
-% \cs{\message} and consequently decides that there is no space to replace.
-% You can get around this by explicitly calling the space scanner again.
-%
-% \begin{example}
-% |\newcommand*\somsg[1]{{%|\\
-% | \so{#1}%|\\
-% | \message{bar}%|\\
-% | \let\\\SOUL@socheck|\\
-% | \\%|\\
-% |}}|\\
-% \end{example}
-%
-% However, \cs{\SOUL@socheck} can't be used directly, because it would discard
-% any normal space. \cs{\\} doesn't have this problem.
-% The additional pair of braces avoids that its definition leaks out
-% of this macro. In the example above you could, of course, simply
-% have put \cs{\message} in front, so you hadn't needed to
-% use the scanner macro \cs{\SOUL@socheck} at all.
-%
-% Many packages do already offer logical markup commands that default
-% to some standard \LaTeX\ font commands or to \cs{\relax}. One example
-% is the \package{jurabib} package~\cite{jurabib}, which makes the use of
-% \soul\ a challenge. This package implements lots of
-% formatting macros. Let's have a look at one of them, \cs{\jbauthorfont},
-% which is used to typeset author names in citations.
-% The attempt to simply
-% define |\let\jbauthorfont\caps| fails, because the macro isn't directly
-% applied to the author name as in |\jbauthorfont{Don Knuth}|, but
-% to another command sequence: |\jbauthorfont{\jb@@author}|. Not even
-% \cs{\jb@@author} contains the name, but instead further commands that
-% at last yield the requested name. That's why we have to expand
-% the contents first. This is quite tricky, because we must not
-% expand too much, either. Fortunately, we can offer the contents
-% wrapped up in yet another macro, so that \soul\ knows that it has to
-% use its own macro expansion mechanism:
-%
-% \begin{example}
-% |\renewcommand*\jbauthorfont[1]{{%|\\
-% | \def\x{#1}%|\\
-% | \caps\x|\\
-% |}}|\\
-% \end{example}
-%
-% Some additional kerning after |\caps\x| wouldn't hurt, because
-% the look-ahead scanner is blinded by further commands that follow
-% in the \package{jurabib} package. Now we run into the next problem:
-% cited names may contain commands
-% that must not get expanded. We have to register them as special
-% command:
-%
-% \begin{example}
-% |\soulregister\jbbtasep{0}|\\
-% |...|\\
-% \end{example}
-%
-% But such registered commands bypass \soul's kernel and we don't
-% get the correct spacing before and afterwards. So we end up
-% redefining \cs{\jbbtasep}, whereby you should, of course, use
-% variables instead of numbers:
-%
-% \begin{example}
-% |\renewcommand*\jbbtasep{%|\\
-% | \kern.06em|\\
-% | \slash|\\
-% | \hskip.06em|\\
-% | \allowbreak|\\
-% |}|\\
-% \end{example}
-%
-% Another problem arises: bibliography entries that must not get
-% teared apart are supposed to be enclosed in additional braces.
-% This, however, won't work with \soul\ because of
-% \ref{par:Grouping hyphenatable material}. A simple trick will
-% get you around that problem: define a dummy command that only
-% outputs its argument, and register that command:
-%
-% \begin{example}
-% |\newcommand*\together[1]{#1}|\\
-% |\soulregister\together{1}|\\
-% \end{example}
-%
-% Now you can write ``|Author = {\together{Don Knuth}}|'' and
-% \package{jurabib} won't dare to reorder the parts of the name.
-% And what if some name shouldn't get letterspaced at all? Overriding
-% a conventional font style like \cs{\textbf} that was globally
-% set is trivial, you just have to specify the style that you
-% prefer in that very bibliography entry. In our example, if we
-% wanted to keep \soul\ from letterspacing a particular entry,
-% although they are all formatted by our \cs{\jbauthorfont}
-% and hence fed to \cs{\caps}, we'd use the following construction:
-%
-% \begin{example}
-% |Author = {\soulomit{\normalfont\huge Donald E. Knuth}}|\\
-% \end{example}
-%
-% The \package{jurabib} package is probably one of the more
-% demanding packages to collaborate with \soul. Everything else
-% can just become easier.
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Typesetting long words in narrow columns}
-% \label{sec:sloppyword}
-%
-% Narrow columns are best set |flushleft|, because not even the best
-% hyphenation algorithm can guarantee acceptable line breaks without
-% overly stretched spaces.
-% However, in some rare cases one may be \emph{forced} to typeset
-% block aligned. When typesetting in languages like German, where
-% there are really long words, the \describemacro{\sloppyword} macro
-% might help a little bit. It adds enough stretchability between the
-% single characters to make the hyphenation algorithm happy, but
-% is still not as ugly as the example in section~\ref{sec:dirtytricks}
-% demonstrates. In the following example the left column was typeset
-% as ``|Die \sloppyword{Donau...novelle} wird ...|'':
-%
-% \begin{center}
-% \def\word{Do\-nau\-dampf\-schiff\-fahrts\-ge\-sell\-schafts\-^^A
-% ka\-pi\-t\"ans\-wit\-wen\-pen\-si\-ons\-ge\-setz\-no\-vel\-le}
-% \begin{minipage}{1.5in}
-% \plainsetup
-% Die
-% \expandafter\sloppyword\expandafter{\word}
-% wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
-% \end{minipage}
-% \hspace{1em}
-% \batchmode
-% \begin{minipage}{1.5in}
-% \plainsetup
-% Die \word\ wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
-% \end{minipage}
-% \errorstopmode
-% \end{center}
-%
-%
-%
-%
-%
-%
-%
-% \subsection{Using \texorpdfstring{\soul\ }{soul }commands in section headings}
-%
-% Letterspacing was often used for section titles in the past,
-% mostly centered and with a closing period. The following example
-% shows how to achieve this using the \package{titlesec}
-% package \cite{titlesec}:
-%
-% \begin{example}
-% |\newcommand*\periodafter[2]{#1{#2}.}|\\
-% |\titleformat{\section}[block]|\\
-% | {\normalfont\centering}|\\
-% | {\thesection.}|\\
-% | {.66em}|\\
-% | {\periodafter\so}|\\
-% |...|\\
-% |\section{Von den Maassen und Maassst\"aben}|\\
-% \end{example}
-%
-% \bigbreak
-% This yields the following output:
-%
-% \bigskip
-% \newbox\examplebox
-% \sbox\examplebox{
-% \begin{minipage}{.9\textwidth}
-% \small
-% \bigskip
-% \begin{center}
-% \so{1\<. Von den Maassen und Maassst\"aben}.
-% \bigskip
-% \end{center}
-% \end{minipage}}
-% \fbox{\usebox\examplebox}
-% \bigbreak
-%
-% \noindent
-% The \cs{\periodafter} macro adds a period to the title, but not to
-% the entry in the table of contents. It takes the name of a command as
-% argument, that shall be applied to the title, for example~\cs{\so}.
-% Here's a more complicated and complete example:
-%
-% \begin{example}
-% |\documentclass{article}|\\
-% |\usepackage[latin1]{inputenc}|\\
-% |\usepackage[T1]{fontenc}|\\
-% |\usepackage{german,soul}|\\
-% |\usepackage[indentfirst]{titlesec}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\newcommand*\sectitle[1]{%|\\
-% | \MakeUppercase{\so{#1}.}\\[.66ex]|\\
-% | \rule{13mm}{.4pt}}|\\
-% |\newcommand*\periodafter[2]{#1{#2.}}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\titleformat{\section}[display]|\\
-% | {\normalfont\centering}|\\
-% | {\S. \thesection.}|\\
-% | {2ex}|\\
-% | {\sectitle}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\titleformat{\subsection}[block]|\\
-% | {\normalfont\centering\bfseries}|\\
-% | {\thesection.}|\\
-% | {.66em}|\\
-% | {\periodafter\relax}|\\
-% \end{example}
-%
-% \indent
-% \begin{example}
-% |\begin{document}|\\
-% |\section{Von den Maassen und Maassst\"aben}|\\
-% |\subsection{Das L\"angenmaass im Allgemeinen}|\\
-% \\
-% |Um L\"angen genau messen und vergleichen zu k\"onnen,|\\
-% |bedarf es einer gewissen, bestimmten Einheit, mit der|\\
-% |man untersucht, wie oft sie selbst, oder ihre Theile,|\\
-% |in der zu bestimmenden L\"ange enthalten sind.|\\
-% |...|\\
-% |\end{document}|
-% \end{example}
-%
-% \bigbreak
-% This example gives you roughly the following output,
-% which is a facsimile from~\cite{Muszynski}.
-%
-% \bigskip
-% \sbox\examplebox{
-% \begin{minipage}{.9\textwidth}
-% \small
-% \bigskip
-% \begin{center}
-% \S. 1.\\[2ex]
-% \so{VON DEN MAASSEN UND MAASSST\"ABEN}.\\[.66ex]
-% \rule{12mm}{.4pt}\\[1.66ex]
-% \textbf{1. Das L\"angenmaass im Allgemeinen.}\\[.66em]
-% \end{center}
-% \leavevmode\qquad
-% Um L\"angen genau messen und vergleichen zu k\"onnen,
-% bedarf es einer gewissen, bestimmten Einheit, mit der
-% man untersucht, wie oft sie selbst, oder ihre Theile,
-% in der zu bestimmenden L\"ange enthalten sind.
-% \bigskip
-% \end{minipage}}
-% \fbox{\usebox\examplebox}
-% \bigbreak
-%
-% \noindent
-% Note that the definition of \cs{\periodafter} decides if
-% the closing period shall be spaced out with the title (1), or
-% follow without space (2):
-%
-% \begin{example}
-% 1.\qquad|\newcommand*\periodafter[2]{#1{#2.}}|\\
-% 2.\qquad|\newcommand*\periodafter[2]{#1{#2}.}|\\
-% \end{example}
-%
-%
-%
-% \noindent
-% If you need to underline section titles, you can easily
-% do it with the help of the \package{titlesec} package. The following
-% example underlines the section title, but not the section
-% number:
-%
-% \begin{example}
-% |\titleformat{\section}|\\
-% | {\LARGE\titlefont}|\\
-% | {\thesection}|\\
-% | {.66em}|\\
-% | {\ul}|\\
-% \end{example}
-%
-% \noindent
-% The \cs{\titlefont} command is provided by the \caps{``\small{KOMA}}~script''
-% package. You can write |\normalfont\sffamily\bfseries| instead.
-% The following example does additionally underline the section number:
-%
-% \begin{example}
-% |\titleformat{\section}|\\
-% | {\LARGE\titlefont}|\\
-% | {\ul{\thesection{\kern.66em}}}|\\
-% | {0pt}|\\
-% | {\ul}|\\
-% \end{example}
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-%
-% \section{How the package works}
-%
-% \subsection{The kernel}
-% \so{Letterspacing,} \ul{underlining}, \st{striking out} and highlighting
-% use the same kernel. It lets a \emph{word scanner} run over the given argument,
-% which inspects every token. If a token is a command registered via \cs{\soulregister},
-% it is executed immediately. Other tokens are only counted and trigger some action
-% when a certain number is reached (quotes and dashes). Three subsequent `|-|', for example,
-% trigger |\SOUL@everyexhyphen{---}|. A third group leads to special actions,
-% like |\mbox| that starts reading-in a whole group to protect its contents and let them be
-% seen as one entity. All other tokens, mostly characters and digits, are collected in
-% a word register, which is passed to the analyzer, whenever a whole word was read in.
-%
-% The analyzer typesets the word in a 1\,sp ($=\frac1{65536}$\,pt) wide \cs{\vbox},
-% hence encouraging \TeX\ to break lines at every possible hyphenation point. It
-% uses the mono-spaced \cs{\SOUL@tt} font (|ectt1000|), so as to avoid any inter-character
-% kerning. Now the \cs{\vbox} is decomposed splitting off \cs{\hbox} after \cs{\hbox}
-% from the bottom. All boxes, each of which contains one syllable, are pushed onto a
-% stack, which is provided by \TeX's grouping mechanism. When returning from the
-% recursion, box after box is fetched from the stack, its width measured and fed to the
-%``reconstructor''.
-%
-% This reconstruction macro (\cs{\SOUL@dosyllable}) starts to read tokens
-% from the just analyzed word until the given syllable
-% width is obtained. This is repeated for each syllable. Every time the engine
-% reaches a relevant state, the corresponding driver macro is executed
-% and, if necessary, provided with some data. There is a macro that is
-% executed for each token, one for each syllable, one for each space etc\null.
-%
-% The engine itself doesn't know how to letterspace or to underline. It
-% just tells the selected driver about the structure of the given argument.
-% There's a default driver (\cs{\SOUL@setup}) that does only set the
-% interface macros to a reasonable default state, but doesn't really do anything.
-% Further drivers can safely inherit these settings and only need to
-% redefine what they want to change.
-%
-%
-%
-%
-%
-% \subsection{The interface}
-% \label{sec:interface}
-%
-% \subsubsection{The registers}
-%
-% The package offers eight interface macros that can be used to define
-% the required actions. Some of the macros receive data as macro parameter
-% or in special \emph{token} or \emph{dimen} registers. Here is a list of
-% all available registers:
-%
-% \begin{labeling}{\hspace{.36\hsize}}
-% \item[\texttt{\string\SOUL@token}]
-% This token register contains the current token. It has to be used as |\the\SOUL@token|.
-% The macro \cs{\SOUL@gettoken} reads the next token into \cs{\SOUL@token} and
-% can be used in any interface macro. If you don't want to lose the old meaning,
-% you have to save it explicitly. \cs{\SOUL@puttoken} pushes the token
-% back into the queue, without changing \cs{\SOUL@token}. You can only
-% put one token back, otherwise you get an error message.
-% \item[\texttt{\string\SOUL@lasttoken}]
-% This token register contains the last token.
-% \item[\texttt{\string\SOUL@syllable}]
-% This token register contains all tokens that were already collected for
-% the current syllable. When used in \cs{\SOUL@everysyllable}, it
-% contains the \emph{whole} syllable.
-% \item[\texttt{\string\SOUL@charkern}]
-% This dimen register contains the kerning value between the current and the next character.
-% Since most character pairs don't require a kerning value to be applied and the
-% output in the logfile shouldn't be cluttered with |\kern0pt| it is
-% recommended to write |\SOUL@setkern\SOUL@charkern|, which sets
-% kerning for non-zero values only.
-% \item[\texttt{\string\SOUL@hyphkern}]
-% This dimen register contains the kerning value between the current character
-% and the hyphen character or, when used in \cs{\SOUL@everyexhyphen}, the
-% kerning between the last character and the explicit hyphen.
-% \end{labeling}
-%
-%
-%
-%
-%
-%
-% \subsubsection{The interface macros}
-%
-% The following list describes each of the interface macros and which
-% registers it can rely on. The mark between label and description
-% will be used in section \ref{sec:interfaceexamples} to show when
-% the macros are executed. The addition |#1| means that the macro
-% takes one argument.
-%
-% \begin{labeling}{\hspace{.36\hsize}}
-% \def\m#1{\leavevmode\llap{\hbox to1em{\hss#1\hss}\hskip.7em}}
-% \item[\texttt{\string\SOUL@preamble}]\m{$P$}^^A
-% executed once at the beginning
-% \item[\texttt{\string\SOUL@postamble}]\m{$E$}^^A
-% executed once at the end
-% \item[\texttt{\string\SOUL@everytoken}]\m{$T$}^^A
-% executed after scanning a token; It gets that
-% token in \cs{\SOUL@token} and has to care for inserting
-% the kerning value \cs{\SOUL@charkern} between this and the next character.
-% To look at the next character, execute \cs{\SOUL@gettoken}, which
-% replaces \cs{\SOUL@token} by the next token. This token has to
-% be put back into the queue using \cs{\SOUL@puttoken}.
-% \item[\texttt{\string\SOUL@everysyllable}]\m{$S$}^^A
-% This macro is executed after scanning a whole syllable. It gets the
-% syllable in \cs{\SOUL@syllable}.
-% \item[\texttt{\string\SOUL@everyhyphen}]\m{$-$}^^A
-% This macro is executed at every implicit hyphenation point.
-% It is responsible for setting the hyphen and will likely do this
-% in a \cs{\discretionary} statement. It has to care about the
-% kerning values. The registers \cs{\SOUL@lasttoken}, \cs{\SOUL@syllable},
-% \cs{\SOUL@charkern} and \cs{\SOUL@hyphkern} contain useful information.
-% Note that \cs{\discretionary} inserts \cs{\exhyphenpenalty}
-% if the first part of the discretionary is empty, and
-% \cs{\hyphenpenalty} else.
-% \item[\texttt{\string\SOUL@everyexhyphen\#1}]\m{$=$}^^A
-% This macro is executed at every explicit hyphenation point. The
-% hyphen `character' (one of hyphen, en-dash, em-dash or \cs{\slash})
-% is passed as parameter |#1|. A minimal implementation
-% would be |{#1\penalty\exhyphenpenalty}|. The kerning value
-% between the last character and the hyphen is passed in \cs{\SOUL@hyphkern},
-% that between the hyphen and the next character in \cs{\SOUL@charkern}.
-% The last syllable can be found in \cs{\SOUL@syllable}, the last
-% character in \cs{\SOUL@lasttoken}.
-% \item[\texttt{\string\SOUL@everyspace\#1}]\m{\texttt{\char`\ }}^^A
-% This macro is executed between every two words. It is responsible for
-% setting the space. The engine submits a \cs{\penalty} setting as
-% parameter |#1| that should be put in front of the space. The
-% macro should at least do |{#1\space}|. Further information can be found in
-% \cs{\SOUL@lasttoken} and \cs{\SOUL@syllable}. Note that this macro does not
-% care for the leading and trailing space. This is the job of
-% \cs{\SOUL@preamble} and \cs{\SOUL@postamble}.
-% \end{labeling}
-%
-%
-%
-%
-%
-%
-% \subsubsection{Some examples}
-% \label{sec:interfaceexamples}
-%
-% The above list's middle column shows a mark that indicates in the
-% following examples, when the respective macros are executed:\nopagebreak
-%
-% \begin{labeling}{\hspace{.36\hsize}}
-% \item[\normalfont\an{word}]
-% \cs{\SOUL@everytoken}$^T$ is executed for every token. \cs{\SOUL@everysyllable}$^S$
-% is \emph{additionally} executed for every syllable. You will mostly just
-% want to use either of them.
-% \item[\normalfont\an{one two}]
-% The macro |\SOUL@everyspace| is executed at every space within
-% the \soul\ argument. It has to take one argument, that can either
-% be empty or contain a penalty, that should be applied to the space.
-% \item[\normalfont\an{example}\kern-1em]
-% The macro |\SOUL@everyhyphen| is executed at every possible
-% implicit hyphenation point.
-% \item[\normalfont\an{beta-test}]
-% Explicit hyphens trigger \cs{\SOUL@everyexhyphen}.
-% \end{labeling}
-%
-%
-%
-% \bigbreak
-% \noindent
-% It's only natural that these examples, too,
-% were automatically typeset by the |soul| package
-% using a special driver:
-%
-% \begin{example}
-% |\DeclareRobustCommand*\an{%|\\
-% | \def\SOUL@preamble{$^{^P}$}%|\\
-% | \def\SOUL@everyspace##1{##1\texttt{\char`\ }}%|\\
-% | \def\SOUL@postamble{$^{^E}$}%|\\
-% | \def\SOUL@everyhyphen{$^{^-}$}%|\\
-% | \def\SOUL@everyexhyphen##1{##1$^{^=}$}%|\\
-% | \def\SOUL@everysyllable{$^{^S}$}%|\\
-% | \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}%|\\
-% | \def\SOUL@everylowerthan{$^{^L}$}%|\\
-% | \SOUL@}|\\
-% \end{example}
-%
-%
-%
-%
-%
-%
-%
-%
-% \subsection{A driver example}
-%
-% Let's define a \soul\ driver that allows to typeset text
-% with a \cs{\cdot} at every potential hyphenation point. The name of
-% the macro shall be \cs{\sy} (for \emph{syllables}).
-% Since the \soul\ mechanism is highly fragile, we use the \LaTeX\
-% command \cs{\DeclareRobustCommand}, so that the \cs{\sy} macro
-% can be used even in section headings etc. The \cs{\SOUL@setup}
-% macro sets all interface macros to reasonable default definitions.
-% This could of course be done manually, too. As we won't
-% make use of \cs{\SOUL@everytoken} and \cs{\SOUL@postamble}
-% and both default to \cs{\relax}, anyway, we don't have to
-% define them here.
-%
-% \begin{example}
-% |\DeclareRobustCommand*\sy{%|\\
-% | \SOUL@setup|\\
-% \end{example}
-%
-% We only set \cs{\lefthyphenmin} and \cs{\righthyphenmin} to zero
-% at the beginning. All changes are restored automatically,
-% so there's nothing to do at the end.
-%
-% \begin{example}
-% | \def\SOUL@preamble{\lefthyphenmin=0 \righthyphenmin=0 }%|\\
-% \end{example}
-%
-% We only want simple spaces. Note that these are not provided
-% by default! \cs{\SOUL@everyspace} may get a penalty to be
-% applied to that space, so we set it before.
-%
-% \begin{example}
-% | \def\SOUL@everyspace##1{##1\space}%|\\
-% \end{example}
-%
-% There's nothing to do for \cs{\SOUL@everytoken}, we rather let
-% \cs{\SOUL@everysyllable} handle a whole syllable at once.
-% This has the advantage, that we don't have to deal with
-% kerning values, because \TeX\ takes care of that.
-%
-% \begin{example}
-% | \def\SOUL@everysyllable{\the\SOUL@syllable}|\\
-% \end{example}
-%
-% The \TeX\ primitive \cs{\discretionary}
-% takes three arguments: 1.~pre-hyphen material
-% 2.~post-hyphen material, and 3.~no-hyphenation material.
-%
-% \begin{example}
-% | \def\SOUL@everyhyphen{%|\\
-% | \discretionary{%|\\
-% | \SOUL@setkern\SOUL@hyphkern|\\
-% | \SOUL@sethyphenchar|\\
-% | }{}{%|\\
-% | \hbox{\kern1pt$\cdot$}%|\\
-% | }%|\\
-% | }%|\\
-%\end{example}
-%
-% Explicit hyphens like dashes and slashes shall be set normally.
-% We just have to care for kerning. The hyphen has to be put in
-% a box, because, as \cs{\hyphenchar}, it would yield its own, internal
-% \cs{\discretionary}. We need to set ours instead, though.
-%
-% \begin{example}
-% | \def\SOUL@everyexhyphen##1{%|\\
-% | \SOUL@setkern\SOUL@hyphkern|\\
-% | \hbox{##1}%|\\
-% | \discretionary{}{}{%|\\
-% | \SOUL@setkern\SOUL@charkern|\\
-% | }%|\\
-% | }|%\\
-% \end{example}
-%
-% Now that the interface macros are defined, we can start the scanner.
-%
-% \begin{example}
-% | \SOUL@|\\
-% |}|\\
-% \end{example}
-%
-% \hyphenation{al-go-rithm lin-guists ex-cel-lent} ^^A correct?
-% \noindent
-% \emph{\sy{This little macro will hardly be good enough
-% for linguists, although it uses {\TeX's} excellent hyphenation algorithm,
-% but it is at least a nice alternative to the}} \cs{\showhyphens} \emph{\sy{command}.}
-%
-%
-%
-%
-%
-%
-%
-% \section*{Acknowledgements}
-%
-% A big thank you goes to \person{Stefan Ulrich} for his tips and bug reports
-% during the development of versions 1.\lower2pt\hbox{*} and for his lessons on high quality
-% typesetting. The \cs{\caps} mechanism was very much influenced by his
-% suggestions. Thanks to \person{Alexander Shibakov} and \person{Frank Mittelbach,}
-% who sent me a couple of bug reports and feature requests, and finally encouraged
-% me to (almost) completely rewrite \soul. \person{Thorsten Manegold} contributed
-% a series of bug reports, helping to fix \soul's macro expander and hence making
-% it work together with the \package{jurabib} package.
-% Thanks to \person{Axel Reichert, Anshuman Pandey,} and \person{Peter Kreynin} for
-% detailed bug reports.
-% \person{Rowland McDonnel} gave useful hints for how to improve the documentation,
-% but I'm afraid he will still not be satisfied, and rightfully so. If only documentation
-% writing weren't that boring.~~\texttt{;-)}
-%
-%
-%
-%
-%
-%
-%
-% \begin{thebibliography}{00}
-% \raggedright
-%
-% \bibitem{jurabib}{\person{Berger, Jens:} \bibtitle{The jurabib package.} \CTAN-Archive, 2002, v0.52h.}
-%
-% \bibitem{titlesec}{\person{Bezos, Javier:} \bibtitle{The titlesec and titletoc package.}
-% \CTAN-Archive, 1999, v2.1.}
-%
-% \bibitem{color}{\person{Carlisle, D. P.:} \bibtitle{The color package.} \CTAN-Archive, 1997, v1.0d.}
-%
-% \bibitem{Duden}{Duden, Volume 1. \bibtitle{Die Rechtschreibung.} Bibliographisches Institut,
-% Mann\-heim--\hskip0pt Wien--Z\"urich, 1986, 19th~edition.}
-%
-% \bibitem{DEK}{\person{Knuth, Donald E.:} \bibtitle{The \TeX book.}
-% Addison--Wesley Publishing Company, Reading/Massachusetts, 1989, 16th~edition.}
-%
-% \bibitem{Muszynski}{\person{Muszynski, Carl} and \person{P\v rihoda, Eduard:}
-% \bibtitle{Die Terrainlehre in Verbindung mit der Darstellung, Beurtheilung und
-% Beschreibung des Terrains vom milit\"arischen
-% Standpunkte.}
-% L.\,W.~Seidel \&\ Sohn, Wien, 1872.}
-%
-% \bibitem{Reglement}{Normalverordnungsblatt f\"ur das k.\,u.\,k.~Heer.
-% \bibtitle{Exercier-Reglement f\"ur die k.\,u.\,k.~Cavallerie, I. Theil.}
-% Wien, k.\,k.~Hof- und Staatsdruckerei, 1898, 4th~edition.}
-%
-% \bibitem{german}{\person{Raichle, Bernd:} \bibtitle{The german package.} \CTAN-Archive, 1998, v2.5e.}
-%
-% \bibitem{yfonts}{\person{Schmidt, Walter:} \bibtitle{Ein Makropaket f\"ur die gebrochenen
-% Schriften.} \CTAN-Archive, 1998, v1.2.}
-%
-% \bibitem{Tschichold}{\person{Tschichold, Jan:} \bibtitle{Ausgew\"ahlte Aufs\"atze \"uber Fragen
-% der Gestalt des Buches und der Typographie.} Birkh\"auser, Basel,
-% 1987, 2nd~edition.}
-%
-% \bibitem{Willberg}{\person{Willberg, Hans Peter} and \person{Forssmann, Friedrich:}
-% \bibtitle{Lesetypographie.} H. Schmidt, Mainz, 1997.}
-%
-% \end{thebibliography}
-%
-%
-% \StopEventually{\addtocontents{toc}{\protect\end{multicols}}}
-%
-%
-%
-%
-%
-%
-%
-%
-%^^A max 72 columns
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \section{The implementation}
-%
-% \subsection*{The package preamble}
-%
-% This piece of code makes sure that the package is only loaded
-% once. While this is guaranteed by \LaTeX, we have to do it
-% manually for all other flavors of \TeX.
-%
-% \begin{macrocode}
-\expandafter\ifx\csname SOUL@\endcsname\relax\else
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% Fake some of the \LaTeX\ commands if we were loaded by another flavor
-% of \TeX. This might break some previously loaded packages, though,
-% if e.\,g.~\cs{\mbox} was already in use. But we don't care \dots
-%
-% \begin{macrocode}
-\ifx\documentclass\SOULundefined
- \chardef\atcode=\catcode`@
- \catcode`\@=11
- \def\DeclareRobustCommand*{\def}
- \let\newcommand\DeclareRobustCommand
- \def\DeclareOption#1#2{\expandafter\def\csname#1\endcsname{#2}}
- \def\PackageError#1#2#3{{%
- \newlinechar`^^J%
- \errorcontextlines\z@
- \edef\\{\errhelp{#3}}\\%
- \errmessage{Package #1 error: #2}%
- }}
- \def\@height{height}
- \def\@depth{depth}
- \def\@width{width}
- \def\@plus{plus}
- \def\@minus{minus}
- \font\SOUL@tt=ectt1000
- \let\@xobeysp\space
- \let\linebreak\break
- \let\mbox\hbox
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% \soul\ tries to be a good \LaTeX\ citizen if used under \LaTeX\ and
-% declares itself properly. Most command sequences in the package
-% are protected by the |SOUL@| namespace, all other macros are first
-% defined to be empty. This will give us an error message \emph{now}
-% if one of those was already used by another package.
-%
-% \begin{macrocode}
-\else
- \NeedsTeXFormat{LaTeX2e}
- \ProvidesPackage{soul}
- [2003/11/17 v2.4 letterspacing/underlining (mf)]
- \newfont\SOUL@tt{ectt1000}
- \newcommand*\sodef{}
- \newcommand*\resetso{}
- \newcommand*\capsdef{}
- \newcommand*\capsfont{}
- \newcommand*\setulcolor{}
- \newcommand*\setuloverlap{}
- \newcommand*\setul{}
- \newcommand*\resetul{}
- \newcommand*\setuldepth{}
- \newcommand*\setstcolor{}
- \newcommand*\sethlcolor{}
- \newcommand*\so{}
- \newcommand*\ul{}
- \newcommand*\st{}
- \newcommand*\hl{}
- \newcommand*\caps{}
- \newcommand*\soulaccent{}
- \newcommand*\soulregister{}
- \newcommand*\soulfont{}
- \newcommand*\soulomit{}
-\fi
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% Other packages wouldn't be happy if we reserved piles of \cs{\newtoks} and
-% \cs{\newdimen}, so we try to get away with their \cs{\...def} counterparts
-% where possible.
-% Local registers are always even, while global ones are odd---this is a
-% \TeX\ convention.
-%
-% \begin{macrocode}
-\newtoks\SOUL@word
-\newtoks\SOUL@lasttoken
-\toksdef\SOUL@syllable\z@
-\newtoks\SOUL@cmds
-\newtoks\SOUL@buffer
-\newtoks\SOUL@token
-\dimendef\SOUL@syllgoal\z@
-\dimendef\SOUL@syllwidth\tw@
-\dimendef\SOUL@charkern=4
-\dimendef\SOUL@hyphkern=6
-\countdef\SOUL@minus\z@
-\countdef\SOUL@comma\tw@
-\countdef\SOUL@apo=4
-\countdef\SOUL@grave=6
-\newskip\SOUL@spaceskip
-\newif\ifSOUL@ignorespaces
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% ^^A\FIXME{\newpage}
-% \begin{macro}{\soulomit}
-% \begin{macro}{\SOUL@ignorem}
-% \begin{macro}{\SOUL@ignore}
-% \begin{macro}{\SOUL@stopm}
-% \begin{macro}{\SOUL@stop}
-% \begin{macro}{\SOUL@relaxm}
-% \begin{macro}{\SOUL@lowerthanm}
-% \begin{macro}{\SOUL@hyphenhintm}
-% These macros are used as markers. To be able to check for such a
-% marker with \cs{\ifx} we have also to create a macro that contains
-% the marker. \cs{\SOUL@spc} shall contain a normal space with a
-% \cs{\catcode} of~10.
-%
-% \begin{macrocode}
-\def\soulomit#1{#1}
-\def\SOUL@stopM{\SOUL@stop}
-\let\SOUL@stop\relax
-\def\SOUL@lowerthan{}
-\def\SOUL@lowerthanM{\<}
-\def\SOUL@hyphenhintM{\-}
-\def\SOUL@n*{\let\SOUL@spc= }\SOUL@n* %
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The kernel}
-%
-% \begin{macro}{\SOUL@}
-% This macro is the entry to \soul. Using it does only make
-% sense after setting up a \soul\ driver. The next token after
-% the \soul\ command will be assigned to \cs{\SOUL@@}. This can be
-% some text enclosed in braces, or the name of a macro that contains text.
-%
-% \begin{macrocode}
-\def\SOUL@{%
- \futurelet\SOUL@@\SOUL@expand
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@expand}
-% If the first token after the \soul\ command was an opening
-% brace we start scanning. Otherwise,
-% if the first token was a macro name, we expand that macro and
-% call \cs{\SOUL@} with its contents again. Unfortunately, we have to
-% exclude some macros therein from expansion.
+% \StopEventually{
+% }
%
-% \begin{macrocode}
-\def\SOUL@expand{%
- \ifcat\bgroup\noexpand\SOUL@@
- \let\SOUL@n\SOUL@start
+% \section{Implementation}
+% \begin{macrocode}
+%<*soulutf8>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{soulutf8}%
+ [2023-02-18 v3.0 Permit use of UTF-8 characters in soul (HO)]%
+\PackageWarning{soulutf8}
+ {This package is obsolete,\MessageBreak
+ use the soul package directly. \MessageBreak
+ }{}%
+\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{soul}}%
+\ProcessOptions\relax
+\RequirePackage{soul}
+%</soulutf8>
+% \end{macrocode}
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Reload check and package identification}
+% Reload check, especially if the package is not used with \LaTeX.
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode35=6 % #
+ \catcode39=12 % '
+ \catcode44=12 % ,
+ \catcode45=12 % -
+ \catcode46=12 % .
+ \catcode58=12 % :
+ \catcode64=11 % @
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \expandafter\let\expandafter\x\csname ver@soul.sty\endcsname
+ \ifx\x\relax % plain-TeX, first loading
+ \else
+ \def\empty{}%
+ \ifx\x\empty % LaTeX, first loading,
+ % variable is initialized, but \ProvidesPackage not yet seen
\else
- \bgroup
- \def\\##1##2{\def##2{\noexpand##2}}%
- \the\SOUL@cmds
- \SOUL@buffer={%
- \\\TeX\\\LaTeX\\\soulomit\\\mbox\\\hbox\\\textregistered
- \\\slash\\\textcircled\\\copyright\\\S\\\,\\\<\\\>\\~%
- \\\\%
- }%
- \def\\##1{\def##1{\noexpand##1}}%
- \the\SOUL@buffer
- \let\protect\noexpand
- \xdef\SOUL@n##1{\noexpand\SOUL@start{\SOUL@@}}%
- \egroup
+ \expandafter\ifx\csname PackageInfo\endcsname\relax
+ \def\x#1#2{%
+ \immediate\write-1{Package #1 Info: #2.}%
+ }%
+ \else
+ \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
+ \fi
+ \x{soul}{The package is already loaded}%
+ \aftergroup\endinput
\fi
- \SOUL@n
-}
-\long\def\SOUL@start#1{{%
- \let\<\SOUL@lowerthan
- \let\>\empty
- \def\soulomit{\noexpand\soulomit}%
- \gdef\SOUL@eventuallyexhyphen##1{}%
- \let\SOUL@soeventuallyskip\relax
- \SOUL@spaceskip=\fontdimen\tw@\font\@plus\fontdimen\thr@@\font
- \@minus\fontdimen4\font
- \SOUL@ignorespacesfalse
- \leavevmode
- \SOUL@preamble
- \SOUL@lasttoken={}%
- \SOUL@word={}%
- \SOUL@minus\z@
- \SOUL@comma\z@
- \SOUL@apo\z@
- \SOUL@grave\z@
- \SOUL@do{#1}%
- \SOUL@postamble
-}}
-\long\def\SOUL@do#1{%
- \SOUL@scan#1\SOUL@stop
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The scanner}
-%
-% \begin{macro}{\SOUL@scan}
-% This is the entry point for the scanner. It calls \cs{\SOUL@eval}
-% and will in turn be called by \cs{\SOUL@eval} again for every
-% new token to be scanned.
-%
-% \begin{macrocode}
-\def\SOUL@scan{%
- \futurelet\SOUL@@\SOUL@eval
+ \fi
+\endgroup%
+% \end{macrocode}
+% Package identification:
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode35=6 % #
+ \catcode39=12 % '
+ \catcode40=12 % (
+ \catcode41=12 % )
+ \catcode44=12 % ,
+ \catcode45=12 % -
+ \catcode46=12 % .
+ \catcode47=12 % /
+ \catcode58=12 % :
+ \catcode64=11 % @
+ \catcode91=12 % [
+ \catcode93=12 % ]
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \expandafter\ifx\csname ProvidesPackage\endcsname\relax
+ \def\x#1#2#3[#4]{\endgroup
+ \immediate\write-1{Package: #3 #4}%
+ \xdef#1{#4}%
+ }%
+ \else
+ \def\x#1#2[#3]{\endgroup
+ #2[{#3}]%
+ \ifx#1\@undefined
+ \xdef#1{#3}%
+ \fi
+ \ifx#1\relax
+ \xdef#1{#3}%
+ \fi
+ }%
+ \fi
+\expandafter\x\csname ver@soul.sty\endcsname
+\ProvidesPackage{soul}%
+ [2023-02-18 v3.0 Permit use of UTF-8 characters in soul (HO)]%
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \catcode64=11 % @
+ \def\x{\endgroup
+ \expandafter\edef\csname SOuL@AtEnd\endcsname{%
+ \endlinechar=\the\endlinechar\relax
+ \catcode13=\the\catcode13\relax
+ \catcode32=\the\catcode32\relax
+ \catcode35=\the\catcode35\relax
+ \catcode61=\the\catcode61\relax
+ \catcode64=\the\catcode64\relax
+ \catcode123=\the\catcode123\relax
+ \catcode125=\the\catcode125\relax
+ }%
+ }%
+\x\catcode61\catcode48\catcode32=10\relax%
+\catcode13=5 % ^^M
+\endlinechar=13 %
+\catcode35=6 % #
+\catcode64=11 % @
+\catcode123=1 % {
+\catcode125=2 % }
+\def\TMP@EnsureCode#1#2{%
+ \edef\SOuL@AtEnd{%
+ \SOuL@AtEnd
+ \catcode#1=\the\catcode#1\relax
+ }%
+ \catcode#1=#2\relax
}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@eval}
-% And here it is: the scanner's heart. It cares for quotes and dashes
-% ligatures and handles all commands that must not be fed to the
-% analyzer.
-%
+\TMP@EnsureCode{10}{12}% ^^J
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{34}{12}% "
+\TMP@EnsureCode{36}{3}% $
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{43}{12}% +
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{58}{12}% :
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{91}{12}% [
+\TMP@EnsureCode{93}{12}% ]
+\TMP@EnsureCode{94}{7}% ^
+\TMP@EnsureCode{96}{12}% `
+\TMP@EnsureCode{126}\active % ~
+\TMP@EnsureCode{128}{12}% ^^80
+\TMP@EnsureCode{147}{12}% ^^93
+\TMP@EnsureCode{148}{12}% ^^94
+\TMP@EnsureCode{160}{12}% ^^a0
+\TMP@EnsureCode{194}{12}% ^^c2
+\TMP@EnsureCode{226}{12}% ^^e2
+\edef\SOuL@AtEnd{\SOuL@AtEnd\noexpand\endinput}
+% \end{macrocode}
+%
+% \subsection{Loading packages}
+%
+% Package \xpackage{soul-ori} uses \cs{documentclass} to detect \LaTeX.
% \begin{macrocode}
-\def\SOUL@eval{%
- \def\SOUL@n*##1{\SOUL@scan}%
- \if\noexpand\SOUL@@\SOUL@spc
- \else
- \SOUL@ignorespacesfalse
- \fi
- \ifnum\SOUL@minus=\thr@@
- \SOUL@flushminus
- \else\ifnum\SOUL@comma=\tw@
- \SOUL@flushcomma
- \else\ifnum\SOUL@apo=\tw@
- \SOUL@flushapo
- \else\ifnum\SOUL@grave=\tw@
- \SOUL@flushgrave
- \fi\fi\fi\fi
- \ifx\SOUL@@-\else\SOUL@flushminus\fi
- \ifx\SOUL@@,\else\SOUL@flushcomma\fi
- \ifx\SOUL@@'\else\SOUL@flushapo\fi
- \ifx\SOUL@@`\else\SOUL@flushgrave\fi
- \ifx\SOUL@@-%
- \advance\SOUL@minus\@ne
- \else\ifx\SOUL@@,%
- \advance\SOUL@comma\@ne
- \else\ifx\SOUL@@'%
- \advance\SOUL@apo\@ne
- \else\ifx\SOUL@@`%
- \advance\SOUL@grave\@ne
- \else
- \SOUL@flushminus
- \SOUL@flushcomma
- \SOUL@flushapo
- \SOUL@flushgrave
- \ifx\SOUL@@\SOUL@stop
- \def\SOUL@n*{%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- }%
- \else\ifx\SOUL@@\par
- \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
- \else\if\noexpand\SOUL@@\SOUL@spc
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \ifSOUL@ignorespaces
- \else
- \SOUL@everyspace{}%
- \fi
- \def\SOUL@n* {\SOUL@scan}%
- \else\ifx\SOUL@@\\%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\unskip\nobreak\hfil\break}%
- \SOUL@ignorespacestrue
- \else\ifx\SOUL@@~%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\nobreak}%
- \else\ifx\SOUL@@\slash
- \SOUL@doword
- \SOUL@eventuallyexhyphen{/}%
- \SOUL@exhyphen{/}%
- \else\ifx\SOUL@@\mbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\hbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\soulomit
- \def\SOUL@n*\soulomit##1{%
- \SOUL@doword
- {\spaceskip\SOUL@spaceskip##1}%
- \SOUL@scan
- }%
- \else\ifx\SOUL@@\break
- \SOUL@doword
- \break
- \else\ifx\SOUL@@\linebreak
- \SOUL@doword
- \SOUL@everyspace{\linebreak}%
- \else\ifcat\bgroup\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addgroup{}}%
- \else\ifcat$\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addmath}%
- \else
- \def\SOUL@n*{\SOUL@dotoken}%
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi\fi\fi\fi
- \SOUL@n*%
-}
+\ifx\documentclass\@undefined
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
%
+% \subsubsection{\plainTeX}
%
-%
-% \begin{macro}{\SOUL@flushminus}
-% \begin{macro}{\SOUL@flushcomma}
-% \begin{macro}{\SOUL@flushapo}
-% \begin{macro}{\SOUL@flushgrave}
-% As their names imply, these macros flush special tokens or token
-% groups to the word register. They don't do anything if the respective
-% counter equals zero. \cs{\SOUL@minus} does also flush the word
-% register, because hyphens disturb the analyzer.
-%
+% First we check, whether package \xpackage{soul-ori} is already loaded.
% \begin{macrocode}
-\def\SOUL@flushminus{%
- \ifcase\SOUL@minus
- \else
- \SOUL@doword
- \SOUL@eventuallyexhyphen{-}%
- \ifcase\SOUL@minus
- \or
- \SOUL@exhyphen{-}%
- \or
- \SOUL@exhyphen{--}%
- \or
- \SOUL@exhyphen{---}%
- \fi
- \SOUL@minus\z@
- \fi
-}
-\def\SOUL@flushcomma{%
- \ifcase\SOUL@comma
- \or
- \edef\x{\SOUL@word={\the\SOUL@word,}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
- \fi
- \SOUL@comma\z@
-}
-\def\SOUL@flushapo{%
- \ifcase\SOUL@apo
- \or
- \edef\x{\SOUL@word={\the\SOUL@word'}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
- \fi
- \SOUL@apo\z@
-}
-\def\SOUL@flushgrave{%
- \ifcase\SOUL@grave
- \or
- \edef\x{\SOUL@word={\the\SOUL@word`}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
- \fi
- \SOUL@grave\z@
-}
+ \expandafter\ifx\csname SOUL@\endcsname\relax
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@dotoken}
-% Command sequences from the \cs{\SOUL@cmds} list are handed over
-% to \cs{\SOUL@docmd}, everything else is added to \cs{\SOUL@word},
-% which will be fed to the analyzer every time a word is completed.
-% Since \emph{robust} commands come with an additional space, we
-% have also to examine if there's a space variant. Otherwise we
-% couldn't detect pre-expanded formerly robust commands.
-%
+% In case of \plainTeX\ package \xpackage{soul-ori} defines some
+% macros in a simple manner that will break the definitions of
+% \xfile{miniltx.tex}, for example. Therefore these macros
+% are first saved and restored afterwards.
% \begin{macrocode}
-\def\SOUL@dotoken#1{%
- \def\SOUL@@{\SOUL@addtoken{#1}}%
- \def\\##1##2{%
- \edef\SOUL@x{\string#1}%
- \edef\SOUL@n{\string##2}%
- \ifx\SOUL@x\SOUL@n
- \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
- \else
- \edef\SOUL@n{\string##2\space}%
- \ifx\SOUL@x\SOUL@n
- \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
- \fi
- \fi
+ \let\SOuL@orgDeclareRobustCommand\DeclareRobustCommand
+ \let\SOuL@orgnewcommand \newcommand
+ \let\SOuL@orgDeclareOption \DeclareOption
+ \let\SOuL@orgPackageError \PackageError
+ \def\SOuL@restorelatexcmds{%
+ \let\DeclareRobustCommand\SOuL@orgDeclareRobustCommand
+ \let\newcommand \SOuL@orgnewcommand
+ \let\DeclareOption \SOuL@orgDeclareOption
+ \let\PackageError \SOuL@orgPackageError
+ }%
+ \input soul-ori.sty\relax
+ \SOuL@restorelatexcmds
+ \fi
+% \end{macrocode}
+% \begin{macro}{\SOUL@error}
+% Package \xpackage{soul-ori}'s use of \cs{PackageError} is replaced
+% by \cs{@PackageError} of package \xpackage{infwarerr}.
+% \begin{macrocode}
+ \input infwarerr.sty\relax
+ \let\SOuL@orgSOUL@error\SOUL@error
+ \def\SOUL@error{%
+ \begingroup
+ \let\PackageError\@PackageError
+ \SOuL@orgSOUL@error
+ \endgroup
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \input etexcmds.sty\relax
+% \end{macrocode}
+% \begin{macro}{\@onelevel@sanitize}
+% Define \LaTeX's \cs{@onelevel@sanitize} if not already available.
+% \begin{macrocode}
+ \expandafter\ifx\csname @onelevel@sanitize\endcsname\relax
+ \def\@onelevel@sanitize#1{%
+ \edef#1{%
+ \expandafter\strip@prefix\meaning#1%
+ }%
}%
- \the\SOUL@cmds
- \SOUL@@
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@docmd}
-% Here we deal with commands that were registered with \cs{\soulregister}
-% or \cs{\soulaccent} or were already predefined in \cs{\SOUL@cmds}.
-% Commands with identifier |9| are accents that are put in a
-% group with their argument. Identifier |8| is reserved for the \cs{\footnote}
-% command, and |7| for the \cs{\textsuperscript} or similar commands.
-% The others are mostly (but not necessarily)
-% font switching commands, which may (|1|) or may not (|0|) take
-% an argument. A registered command leads to the current word
-% buffer being flushed to the analyzer, after which the command
-% itself is executed.
-%
-% Font switching commands which take an argument need special
-% treatment: They need to increment the level counter, so that
-% \cs{\SOUL@eval} knows where to stop scanning. Furthermore the
-% scanner has to be enabled to see the next token after the opening
-% brace.
-%
-%
-% \begin{macrocode}
-\def\SOUL@docmd#1#2{%
- \ifx9#1%
- \def\SOUL@@{\SOUL@addgroup{#2}}%
- \else\ifx8#1%
- \SOUL@doword
- \def\SOUL@@##1{%
- \SOUL@token={\footnotemark}%
- \SOUL@everytoken
- \SOUL@syllable={\footnotemark}%
- \SOUL@everysyllable
- \footnotetext{##1}%
- \SOUL@doword
- \SOUL@scan
- }%
- \else\ifx7#1%
- \SOUL@doword
- \def\SOUL@@##1{%
- \SOUL@token={#2{##1}}%
- \SOUL@everytoken
- \SOUL@syllable={#2{##1}}%
- \SOUL@everysyllable
- \SOUL@doword
- \SOUL@scan
- }%
- \else\ifx1#1%
- \SOUL@doword
- \def\SOUL@@##1{%
- #2{\protect\SOUL@do{##1}}%
- \SOUL@scan
- }%
- \else
- \SOUL@doword
- #2%
- \let\SOUL@@\SOUL@scan
- \fi\fi\fi\fi
- \SOUL@@
-}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@addgroup}
-% \begin{macro}{\SOUL@addmath}
-% \begin{macro}{\SOUL@addprotect}
-% \begin{macro}{\SOUL@addtoken}
-% The macro names say it all. Each of these macros adds some
-% token to the word buffer \cs{\SOUL@word}. Setting \cs{\protect}
-% is necessary to make things like |\so{{a\itshape b}}| work.
-%
+% \end{macro}
+% \begin{macro}{\strip@prefix}
% \begin{macrocode}
-\def\SOUL@addgroup#1#2{%
- {\let\protect\noexpand
- \edef\x{\global\SOUL@word={\the\SOUL@word{{\noexpand#1#2}}}}\x}%
- \SOUL@scan
-}
-\def\SOUL@addmath$#1${%
- {\let\protect\noexpand
- \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{$#1$}}}}}\x}%
- \SOUL@scan
-}
-\def\SOUL@addprotect#1#2{%
- {\let\protect\noexpand
- \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{#2}}}}}\x}%
- \SOUL@scan
-}
-\def\SOUL@addtoken#1{%
- \edef\x{\SOUL@word={\the\SOUL@word\noexpand#1}}\x
- \SOUL@scan
-}
+ \def\strip@prefix#1>{}%
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@exhyphen}
-% Dealing with explicit hyphens can't be done before we know the
-% following character, because we need to know if a kerning value
-% has to be inserted, hence we delay the \cs{\SOUL@everyexhyphen} call.
-% Unfortunately, the word scanner has no look-ahead mechanism.
-%
+% \end{macro}
% \begin{macrocode}
-\def\SOUL@exhyphen#1{%
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}{#1}%
- \gdef\SOUL@eventuallyexhyphen##1{%
- \SOUL@getkern{#1}{\SOUL@charkern}{##1}%
- \SOUL@everyexhyphen{#1}%
- \gdef\SOUL@eventuallyexhyphen####1{}%
- }%
-}
+ \fi
+\else
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@cmds}
-% Here is a list of pre-registered commands that the analyzer
-% cannot handle, so the scanner has to look after them. Every
-% entry consists of a handle (\cs{\\}), an identifier and the
-% macro name. The class identifier can be |9| for accents,
-% |8| for the \cs{\footnote} command, |7| for the
-% \cs{\textsuperscript} command,
-% |0| for commands without arguments and |1| for commands that
-% take one argument. Commands with two or more arguments are
-% not supported.
%
+% \subsubsection{\LaTeX}
% \begin{macrocode}
-\SOUL@cmds={%
- \\9\`\\9\'\\9\^\\9\"\\9\~\\9\=\\9\.%
- \\9\u\\9\v\\9\H\\9\t\\9\c\\9\d\\9\b\\9\r
- \\1\emph\\1\textrm\\1\textsf\\1\texttt\\1\textmd\\1\textbf
- \\1\textup\\1\textsl\\1\textit\\1\textsc\\1\textnormal
- \\0\rmfamily\\0\sffamily\\0\ttfamily\\0\mdseries\\0\upshape
- \\0\slshape\\0\itshape\\0\scshape\\0\normalfont
- \\0\em\\0\rm\\0\bf\\0\it\\0\tt\\0\sc\\0\sl\\0\sf
- \\0\tiny\\0\scriptsize\\0\footnotesize\\0\small
- \\0\normalsize\\0\large\\0\Large\\0\LARGE\\0\huge\\0\Huge
- \\1\MakeUppercase\\7\textsuperscript\\8\footnote
- \\1\textfrak\\1\textswab\\1\textgoth
- \\0\frakfamily\\0\swabfamily\\0\gothfamily
-}
+ \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{soul-ori}}%
+ \ProcessOptions\relax
+ \RequirePackage{soul-ori}[2023-02-18]%
+ \RequirePackage{infwarerr}[2019/12/03]%
+ \RequirePackage{etexcmds}[2019/12/15]%
+\fi
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
%
+% \subsubsection{\eTeX}
%
-%
-% \begin{macro}{\soulregister}
-% \begin{macro}{\soulfont}
-% \begin{macro}{\soulaccent}
-% Register a font switching command (or some other command) for the
-% scanner. The first argument is the macro name, the second is
-% the number of arguments (|0|~or~|1|). Example: |\soulregister{\bold}{0}|.
-% \cs{\soulaccent} has only one argument---the accent macro name.
-% Example: |\soulaccent{\~}|. It is a shortcut for |\soulregister{\~}{9}|.
-% The \cs{\soulfont} command is a synonym for \cs{\soulregister}
-% and is kept for compatibility reasons.
-%
+% In \plainTeX\ command \cs{+} is an \emph{outer} macro.
+% Therefore numbers are used to avoid problems.
% \begin{macrocode}
-\def\soulregister#1#2{{%
- \edef\x{\global\SOUL@cmds={\the\SOUL@cmds
- \noexpand\\#2\noexpand#1}}\x
-}}
-\def\soulaccent#1{\soulregister{#1}9}
-\let\soulfont\soulregister
+\ifetex@unexpanded
+ \catcode33=14 % '!': comment
+ \catcode43=9 % '+': ignore
+\else
+ \catcode33=9 % '!': ignore
+ \catcode43=14 % '+': comment
+\fi
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The analyzer}
%
-% \begin{macro}{\SOUL@doword}
-% The only way to find out, where a given word can be broken into
-% syllables, is to let \TeX\ actually typeset the word under conditions
-% that enforce every possible hyphenation. The result is a paragraph with one
-% line for every syllable.
+% \subsection{Macro for redefinitions}
%
+% \begin{macro}{\SOuL@redefine}
% \begin{macrocode}
-\def\SOUL@doword{%
- \edef\x{\the\SOUL@word}%
- \ifx\x\empty
- \else
- \SOUL@buffer={}%
- \setbox\z@\vbox{%
- \SOUL@tt
- \hyphenchar\font`\-
- \hfuzz\maxdimen
- \hbadness\@M
- \pretolerance\m@ne
- \tolerance\@M
- \leftskip\z@
- \rightskip\z@
- \hsize1sp
- \everypar{}%
- \parfillskip\z@\@plus1fil
- \hyphenpenalty-\@M
- \noindent
- \hskip\z@
- \relax
- \the\SOUL@word}%
- \let\SOUL@errmsg\SOUL@error
- \let\-\relax
- \count@\m@ne
- \SOUL@analyze
- \SOUL@word={}%
- \fi
+\def\SOuL@redefine#1{%
+ \begingroup
+ \def\SOuL@cmd{#1}%
+ \afterassignment\SOuL@cmdcheck
+ \def\SOuL@temp
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% We store the hyphen width of the |ectt1000| font,
-% because we will need it in |\SOUL@doword|. (|ectt1000| is a mono-spaced
-% font, so every other character would have worked, too.)
-%
+% \end{macro}
+% \begin{macro}{\SOuL@cmdcheck}
% \begin{macrocode}
-\setbox\z@\hbox{\SOUL@tt-}
-\newdimen\SOUL@ttwidth
-\SOUL@ttwidth\wd\z@
-\def\SOUL@sethyphenchar{%
- \ifnum\hyphenchar\font=\m@ne
+\def\SOuL@cmdcheck{%
+ \expandafter\ifx\SOuL@cmd\SOuL@temp
\else
- \char\hyphenchar\font
+ \edef\SOuL@temp*{\expandafter\string\SOuL@cmd}%
+ \@PackageWarningNoLine{soul}{%
+ Command \SOuL@temp* has changed.\MessageBreak
+ Supported versions of package `soul-ori': 2021/12/14.\MessageBreak
+ Depending on the unknown changes the redefinition\MessageBreak
+ of \SOuL@temp* may not behave correctly%
+ }%
\fi
+ \expandafter\endgroup
+ \expandafter\def\SOuL@cmd
}
% \end{macrocode}
+% \end{macro}
%
+% \subsection{Redefinition of \cs{SOUL@eval}}
%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@analyze}
-% This macro decomposes the box that |\SOUL@doword| has built.
-% Because we have to start at the bottom, we put every
-% syllable onto the stack and execute ourselves recursively. If there
-% are no syllables left, we return from the recursion and pick syllable
-% after syllable from the stack again---this time from top to bottom---and
-% hand the syllable width |\SOUL@syllgoal| over to |\SOUL@dosyllable|.
-% All but the last syllable end with the hyphen character, hence
-% we subtract the hyphen width accordingly. After processing a
-% syllable we calculate the hyphen kern (i.\,e.~the kerning amount
-% between the last character and the hyphen). This might be needed
-% by \cs{\SOUL@everyhyphen}, which we call now.
-%
+% \begin{macro}{\SOUL@eval}
+% Macro \cs{SOUL@eval} is redefined to add detection of
+% the first byte of a UTF-8 sequence. Because \cs{SOUL@eval}
+% is overwritten, a warning is issued, if the contents of
+% \cs{SOUL@eval} is not as expected.
% \begin{macrocode}
-\def\SOUL@analyze{{%
- \setbox\z@\vbox{%
- \unvcopy\z@
- \unskip
- \unpenalty
- \global\setbox\@ne=\lastbox}%
- \ifvoid\@ne
- \else
- \setbox\@ne\hbox{\unhbox\@ne}%
- \SOUL@syllgoal=\wd\@ne
- \advance\count@\@ne
- \SOUL@analyze
- \SOUL@syllwidth\z@
- \SOUL@syllable={}%
- \ifnum\count@>\z@
- \advance\SOUL@syllgoal-\SOUL@ttwidth
- \SOUL@dosyllable
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}%
- {\SOUL@sethyphenchar}%
- \SOUL@everyhyphen
- \else
- \SOUL@dosyllable
- \fi
- \fi
-}}
+\SOuL@redefine\SOUL@eval{%
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@dosyllable}
-% This macro typesets token after token from \cs{\SOUL@word}
-% until \cs{\SOUL@syllwidth} has reached
-% the requested width \cs{\SOUL@syllgoal}. Furthermore the kerning
-% values are prepared in case \cs{\SOUL@everytoken} needs them.
-% The \cs{\<} command used by \cs{\so} and \cs{\caps} needs some
-% special treatment: It has to be checked for, even before
-% we can end a syllable.
-%
+% First the expected definition.
% \begin{macrocode}
-\def\SOUL@dosyllable{%
- \SOUL@gettoken
- \SOUL@eventuallyexhyphen{\the\SOUL@token}%
- \edef\x{\the\SOUL@token}%
- \ifx\x\SOUL@hyphenhintM
- \let\SOUL@n\SOUL@dosyllable
- \else\ifx\x\SOUL@lowerthanM
- \SOUL@gettoken
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
- {\the\SOUL@token}%
- \SOUL@everylowerthan
- \SOUL@puttoken
- \let\SOUL@n\SOUL@dosyllable
- \else\ifdim\SOUL@syllwidth=\SOUL@syllgoal
- \SOUL@everysyllable
- \SOUL@puttoken
- \let\SOUL@n\relax
- \else\ifx\x\SOUL@stopM
- \SOUL@errmsg
- \global\let\SOUL@errmsg\relax
- \let\SOUL@n\relax
- \else
- \setbox\tw@\hbox{\SOUL@tt\the\SOUL@token}%
- \advance\SOUL@syllwidth\wd\tw@
- \global\SOUL@lasttoken=\SOUL@token
- \SOUL@gettoken
- \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
- {\the\SOUL@token}%
- \SOUL@puttoken
- \global\SOUL@token=\SOUL@lasttoken
- \SOUL@everytoken
- \edef\x{\SOUL@syllable={\the\SOUL@syllable\the\SOUL@token}}\x
- \let\SOUL@n\SOUL@dosyllable
- \fi\fi\fi\fi
- \SOUL@n
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@gettoken}
-% Provide the next token in \cs{\SOUL@token}. If there's already one
-% in the buffer, use that one first.
-%
-% \begin{macrocode}
-\def\SOUL@gettoken{%
- \edef\x{\the\SOUL@buffer}%
- \ifx\x\empty
- \SOUL@nexttoken
+ \def\SOUL@n*##1{\SOUL@scan}%
+ \if\noexpand\SOUL@@\SOUL@spc
+ \else
+ \SOUL@ignorespacesfalse
+ \fi
+ \ifnum\SOUL@minus=\thr@@
+ \SOUL@flushminus
+ \else\ifnum\SOUL@comma=\tw@
+ \SOUL@flushcomma
+ \else\ifnum\SOUL@apo=\tw@
+ \SOUL@flushapo
+ \else\ifnum\SOUL@grave=\tw@
+ \SOUL@flushgrave
+ \fi\fi\fi\fi
+ \ifx\SOUL@@-\else\SOUL@flushminus\fi
+ \ifx\SOUL@@,\else\SOUL@flushcomma\fi
+ \ifx\SOUL@@'\else\SOUL@flushapo\fi
+ \ifx\SOUL@@`\else\SOUL@flushgrave\fi
+ \ifx\SOUL@@-%
+ \advance\SOUL@minus\@ne
+ \else\ifx\SOUL@@,%
+ \advance\SOUL@comma\@ne
+ \else\ifx\SOUL@@'%
+ \advance\SOUL@apo\@ne
+ \else\ifx\SOUL@@`%
+ \advance\SOUL@grave\@ne
+ \else
+ \SOUL@flushminus
+ \SOUL@flushcomma
+ \SOUL@flushapo
+ \SOUL@flushgrave
+ \ifx\SOUL@@\SOUL@stop
+ \def\SOUL@n*{%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ }%
+ \else\ifx\SOUL@@\par
+ \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
+ \else\if\noexpand\SOUL@@\SOUL@spc
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \ifSOUL@ignorespaces
+ \else
+ \SOUL@everyspace{}%
+ \fi
+ \def\SOUL@n* {\SOUL@scan}%
+ \else\ifx\SOUL@@\\%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\unskip\nobreak\hfil\break}%
+ \SOUL@ignorespacestrue
+ \else\ifx\SOUL@@~%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \else\ifx\SOUL@@\slash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{/}%
+ \SOUL@exhyphen{/}%
+ \else\ifx\SOUL@@\mbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\hbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\soulomit
+ \def\SOUL@n*\soulomit##1{%
+ \SOUL@doword
+ {\spaceskip\SOUL@spaceskip##1}%
+ \SOUL@scan
+ }%
+ \else\ifx\SOUL@@\break
+ \SOUL@doword
+ \break
+ \else\ifx\SOUL@@\linebreak
+ \SOUL@doword
+ \SOUL@everyspace{\linebreak}%
+ \else\ifcat\bgroup\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addgroup{}}%
+ \else\ifcat$\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addmath}%
\else
- \global\SOUL@token=\SOUL@buffer
- \global\SOUL@buffer={}%
- \fi
-}
+ \def\SOUL@n*{\SOUL@dotoken}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi
+ \SOUL@n*%
+}{%
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@puttoken}
-% The possibility to put tokens back makes the scanner design much
-% cleaner. There's only room for one token, though, so we issue
-% an error message if \cs{\SOUL@puttoken} is told to put a token
-% back while the buffer is still in use. Note that \cs{\SOUL@debug}
-% is actually undefined. This won't hurt as it can only happen
-% during driver design. No user will ever see this message.
-%
+% Now the redefined version follows.
% \begin{macrocode}
-\def\SOUL@puttoken{%
- \edef\x{\the\SOUL@buffer}%
- \ifx\x\empty
- \global\SOUL@buffer=\SOUL@token
- \global\SOUL@token={}%
+ \def\SOUL@n*##1{\SOUL@scan}%
+ \if\noexpand\SOUL@@\SOUL@spc
+ \else
+ \SOUL@ignorespacesfalse
+ \fi
+ \ifnum\SOUL@minus=\thr@@
+ \SOUL@flushminus
+ \else\ifnum\SOUL@comma=\tw@
+ \SOUL@flushcomma
+ \else\ifnum\SOUL@apo=\tw@
+ \SOUL@flushapo
+ \else\ifnum\SOUL@grave=\tw@
+ \SOUL@flushgrave
+ \fi\fi\fi\fi
+ \ifx\SOUL@@-\else\SOUL@flushminus\fi
+ \ifx\SOUL@@,\else\SOUL@flushcomma\fi
+ \ifx\SOUL@@'\else\SOUL@flushapo\fi
+ \ifx\SOUL@@`\else\SOUL@flushgrave\fi
+ \ifx\SOUL@@-%
+ \advance\SOUL@minus\@ne
+ \else\ifx\SOUL@@,%
+ \advance\SOUL@comma\@ne
+ \else\ifx\SOUL@@'%
+ \advance\SOUL@apo\@ne
+ \else\ifx\SOUL@@`%
+ \advance\SOUL@grave\@ne
+ \else
+ \SOUL@flushminus
+ \SOUL@flushcomma
+ \SOUL@flushapo
+ \SOUL@flushgrave
+ \ifx\SOUL@@\SOUL@stop
+ \def\SOUL@n*{%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ }%
+ \else\ifx\SOUL@@\par
+ \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
+ \else\if\noexpand\SOUL@@\SOUL@spc
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \ifSOUL@ignorespaces
+ \else
+ \SOUL@everyspace{}%
+ \fi
+ \def\SOUL@n* {\SOUL@scan}%
+ \else\ifx\SOUL@@\\%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\unskip\nobreak\hfil\break}%
+ \SOUL@ignorespacestrue
+ \else\ifx\SOUL@@~%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \else\ifx\SOUL@@\slash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{/}%
+ \SOUL@exhyphen{/}%
+ \else\ifx\SOUL@@\mbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\hbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\soulomit
+ \def\SOUL@n*\soulomit##1{%
+ \SOUL@doword
+ {\spaceskip\SOUL@spaceskip##1}%
+ \SOUL@scan
+ }%
+ \else\ifx\SOUL@@\break
+ \SOUL@doword
+ \break
+ \else\ifx\SOUL@@\linebreak
+ \SOUL@doword
+ \SOUL@everyspace{\linebreak}%
+ \else\ifcat\bgroup\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addgroup{}}%
+ \else\ifcat$\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addmath}%
\else
- \SOUL@debug{puttoken called twice}%
- \fi
-}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@nexttoken}
-% \begin{macro}{\SOUL@splittoken}
-% If the word buffer \cs{\SOUL@word} is empty, deliver a \cs{\SOUL@stop},
-% otherwise take the next token.
-%
-% \begin{macrocode}
-\def\SOUL@nexttoken{%
- \edef\x{\the\SOUL@word}%
- \ifx\x\empty
- \SOUL@token={\SOUL@stop}%
- \else
- \expandafter\SOUL@splittoken\the\SOUL@word\SOUL@stop
- \fi
-}
-\def\SOUL@splittoken#1#2\SOUL@stop{%
- \global\SOUL@token={#1}%
- \global\SOUL@word={#2}%
+% The current token is examined to detect the start of
+% a UTF-8 sequence.
+% \begin{macrocode}
+ \SOuL@analyzeutfviii
+ \ifcase\SOuL@octets
+ \SOuL@analyzeutfviiix
+ \fi
+ \ifcase\SOuL@octets
+ \def\SOUL@n*{\SOUL@dotoken}%
+ \or % 1
+ \or % 2
+ \def\SOUL@n*{\SOuL@addtwooctets}%
+ \or % 3
+ \def\SOUL@n*{\SOuL@addthreeoctets}%
+ \or % 4
+ \def\SOUL@n*{\SOuL@addfouroctets}%
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi
+ \SOUL@n*%
}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
+% \end{macro}
%
+% \subsection{UTF-8 analysis}
%
-% \begin{macro}{\SOUL@getkern}
-% Assign the kerning value between the first and the third argument
-% to the second, which has to be a \cs{\dimen} register.
-% |\SOUL@getkern{A}{\dimen0}{V}| will assign the kerning value
-% between `A' and `V' to |\dimen0|.
+% \subsubsection{Help strings}
%
% \begin{macrocode}
-\def\SOUL@getkern#1#2#3{%
- \setbox\tw@\hbox{#1#3}%
- #2\wd\tw@
- \setbox\tw@\hbox{#1\null#3}%
- \advance#2-\wd\tw@
+\def\SOuL@defsanitizedstring#1#2{%
+ \expandafter\def\csname SOuL@string#1\endcsname{#2}%
+ \expandafter\@onelevel@sanitize\csname SOuL@string#1\endcsname
}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@setkern}
-% Set a kerning value if it doesn't equal 0\,pt. Of course, we could
-% also set a zero value, but that would needlessly clutter the
-% logfile.
-%
-% \begin{macrocode}
-\def\SOUL@setkern#1{\ifdim#1=\z@\else\kern#1\fi}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@error}
-% This error message will be shown once for every word that couldn't
-% be reconstructed by \cs{\SOUL@dosyllable}.
-%
-% \begin{macrocode}
-\def\SOUL@error{%
- \vrule\@height.8em\@depth.2em\@width1em
- \PackageError{soul}{Reconstruction failed}{%
- I came across hyphenatable material enclosed in group
- braces,^^Jwhich I can't handle. Either drop the braces or
- make the material^^Junbreakable using an \string\mbox\space
- (\string\hbox). Note that a space^^Jalso counts as possible
- hyphenation point. See page 4 of the manual.^^JI'm leaving
- a black square so that you can see where I am right now.%
+\SOuL@defsanitizedstring{UTFviii}{UTFviii@}
+\SOuL@defsanitizedstring{octets}{@octets}
+\SOuL@defsanitizedstring{two}{two}
+\SOuL@defsanitizedstring{three}{three}
+\SOuL@defsanitizedstring{four}{four}
+\SOuL@defsanitizedstring{macrocolon}{macro:}
+\SOuL@defsanitizedstring{csnameu}{csname u8-}
+\SOuL@defsanitizedstring{undeferr}{utf@viii@undeferr}
+\def\SOuL@stringendash{^^e2^^80^^93}
+\def\SOuL@stringemdash{^^e2^^80^^94}
+\def\SOuL@stringnobreakspace{^^c2^^a0}
+\edef\SOuL@charhash{\string #}
+\edef\SOuL@chartwo{\string 2}
+\edef\SOuL@charthree{\string 3}
+\def\SOuL@empty{}
+% \end{macrocode}
+%
+% \subsubsection{Support for \xfile{utf8.def}}
+%
+% \begin{macro}{\SOuL@analyzeutfviii}
+% \begin{macrocode}
+\begingroup
+ \edef\x{\endgroup
+ \def\noexpand\SOuL@analyzeutfviii{%
+ \noexpand\expandafter\noexpand\SOuL@checkutfviii
+ \noexpand\meaning\noexpand\SOUL@@
+ \SOuL@stringUTFviii\SOuL@stringoctets
+ \noexpand\@nil
}%
+ \def\noexpand\SOuL@checkutfviii
+ ##1\SOuL@stringUTFviii##2\SOuL@stringoctets##3\noexpand\@nil
+ }%
+\x{%
+ \def\SOuL@temp{#2}%
+ \chardef\SOuL@octets=%
+ \ifx\SOuL@temp\SOuL@stringtwo
+ \tw@
+ \else\ifx\SOuL@temp\SOuL@stringthree
+ \thr@@
+ \else\ifx\SOuL@temp\SOuL@stringfour
+ 4 %
+ \else
+ \z@
+ \fi\fi\fi
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@setup}
-% This is a null driver, that will be used as the basis for
-% other drivers. These have then to redefine only interface commands
-% that shall differ from the default.
-%
-% \begin{macrocode}
-\def\SOUL@setup{%
- \let\SOUL@preamble\relax
- \let\SOUL@postamble\relax
- \let\SOUL@everytoken\relax
- \let\SOUL@everysyllable\relax
- \def\SOUL@everyspace##1{##1\space}%
- \let\SOUL@everyhyphen\relax
- \def\SOUL@everyexhyphen##1{##1}%
- \let\SOUL@everylowerthan\relax
-}
-\SOUL@setup
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The \texorpdfstring{\so{letterspacing}}{letterspacing} driver}
-%
-% \begin{macro}{\SOUL@sosetletterskip}
-% A handy helper macro that sets the inter-letter skip with a
-% draconian \cs{\penalty}.
-%
-% \begin{macrocode}
-\def\SOUL@sosetletterskip{\nobreak\hskip\SOUL@soletterskip}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@sopreamble}
-% If letterspacing (\cs{\so} or \cs{\caps}) follows a white space, we
-% replace it with our \syn{outer space}. \LaTeX\ uses |\hskip1sp| as
-% marker in tabular entries, so we ignore tiny skips.
-%
-% \begin{macrocode}
-\def\SOUL@sopreamble{%
- \ifdim\lastskip>5sp
- \unskip
- \hskip\SOUL@soouterskip
- \fi
- \spaceskip\SOUL@soinnerskip
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@sopostamble}
-% Start the look-ahead scanner \cs{\SOUL@socheck} outside the \cs{\SOUL@}
-% scope. That's why we make the \syn{outer space} globally available in
-% \cs{\skip@}.
-%
-% \begin{macrocode}
-\def\SOUL@sopostamble{%
- \global\skip@=\SOUL@soouterskip
- \aftergroup\SOUL@socheck
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
+% \end{macro}
%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@socheck}
-% \begin{macro}{\SOUL@sodoouter}
-% Read the next token after the \soul\ command into \cs{\SOUL@@}
-% and examine it. If it's some kind of space, replace it with
-% \syn{outer space} and the appropriate penalty, else if it's
-% a closing brace, continue scanning. If it is neither: do nothing.
+% \subsubsection{Support for \xfile{utf8x.def}}
%
+% \begin{macro}{\SOuL@analyzeutfviiix}
% \begin{macrocode}
-\def\SOUL@socheck{%
- \futurelet\SOUL@@\SOUL@sodoouter
-}
-\def\SOUL@sodoouter{%
- \def\SOUL@n*##1{\hskip\skip@}%
- \ifcat\egroup\noexpand\SOUL@@
- \unkern
- \egroup
- \def\SOUL@n*{\afterassignment\SOUL@socheck\let\SOUL@x=}%
- \else\ifx\SOUL@spc\SOUL@@
- \def\SOUL@n* {\hskip\skip@}%
- \else\ifx~\SOUL@@
- \def\SOUL@n*~{\nobreak\hskip\skip@}%
- \else\ifx\ \SOUL@@
- \else\ifx\space\SOUL@@
- \else\ifx\@xobeysp\SOUL@@
- \else
- \def\SOUL@n*{}%
- \let\SOUL@@\relax
- \fi\fi\fi\fi\fi\fi
- \SOUL@n*%
-}
+\begingroup
+ \edef\x{\endgroup
+ \def\noexpand\SOuL@analyzeutfviiix{%
+ \noexpand\expandafter\noexpand\SOuL@checkutfviiix
+ \noexpand\meaning\noexpand\SOUL@@
+ \SOuL@stringmacrocolon\SOuL@charhash1{}{}{}{}%
+ \SOuL@stringcsnameu\SOuL@stringundeferr
+ \noexpand\@nil
+ }%
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeverytoken}
-% Typeset the token and put an unbreakable inter-letter skip
-% thereafter. If the token is \cs{\<} then remove the last skip instead.
-% Gets the character kerning value between the actual and the
-% next token in \cs{\SOUL@charkern}.
-%
-% \begin{macrocode}
-\def\SOUL@soeverytoken{%
- \edef\x{\the\SOUL@token}%
- \ifx\x\SOUL@lowerthanM
+% \end{macro}
+% \begin{macro}{\SOuL@checkutfviiix}
+% \begin{macrocode}
+ \def\noexpand\SOuL@checkutfviiix
+ ##1\SOuL@stringmacrocolon\SOuL@charhash1##2##3##4##5##6%
+ \SOuL@stringcsnameu##7\SOuL@stringundeferr##8\noexpand\@nil
+ }%
+\x{%
+ \def\SOuL@temp{#7}%
+ \ifx\SOuL@temp\SOuL@empty
+ \chardef\SOuL@octets=\z@
+ \else
+ \def\SOuL@temp{#5}%
+ \ifx\SOuL@temp\SOuL@charthree
+ \chardef\SOuL@octets=4 %
\else
- \global\let\SOUL@soeventuallyskip\SOUL@sosetletterskip
- \the\SOUL@token
- \SOUL@gettoken
- \edef\x{\the\SOUL@token}%
- \ifx\x\SOUL@stopM
- \else
- \SOUL@setkern\SOUL@charkern
- \SOUL@sosetletterskip
- \SOUL@puttoken
- \fi
+ \def\SOuL@temp{#3}%
+ \ifx\SOuL@temp\SOuL@chartwo
+ \chardef\SOuL@octets=\thr@@
+ \else
+ \chardef\SOuL@octets=\tw@
+ \fi
\fi
+ \fi
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeveryspace}
-% This macro sets an \syn{inner space}. The argument may contain
-% penalties and is used for the |~| command. This construction was
-% needed to make colored underlines work, without having to put
-% any of the coloring commands into the core. |\kern\z@| prevents
-% in subsequent \cs{\so} commands that the second discards the
-% \syn{outer space} of the first. To remove the space simply
-% use |\unkern\unskip|.
-%
-% \begin{macrocode}
-\def\SOUL@soeveryspace#1{#1\space\kern\z@}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeveryhyphen}
-% Sets implicit hyphens. The kerning value between the current token
-% and the hyphen character is passed in \cs{\SOUL@hyphkern}.
-%
-% \begin{macrocode}
-\def\SOUL@soeveryhyphen{%
- \discretionary{%
- \unkern
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@sethyphenchar
- }{}{}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
+% \end{macro}
%
+% \subsection{Actions for UTF-8 sequences}
%
-%
-% \begin{macro}{\SOUL@soeveryexhyphen}
-% Sets the explicit hyphen that is passed as argument.
-% \cs{\SOUL@soeventuallyskip} equals \cs{\SOUL@sosetletterskip},
-% except when a \cs{\<} had been detected. This is necessary because
-% \cs{\SOUL@soeveryexhyphen} wouldn't know otherwise, that it
-% follows a~\cs{\<}.
-%
+% \begin{macro}{\SOuL@addtwooctets}
% \begin{macrocode}
-\def\SOUL@soeveryexhyphen#1{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@soeventuallyskip
- \hbox{#1}%
- \discretionary{}{}{%
- \SOUL@setkern\SOUL@charkern
+\def\SOuL@addtwooctets#1#2{%
+ \def\SOuL@temp{#1#2}%
+ \@onelevel@sanitize\SOuL@temp
+ \ifx\SOuL@temp\SOuL@stringnobreakspace
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \let\SOuL@next\SOUL@scan
+ \else
+ \def\SOuL@next{%
+! \SOUL@addtoken{{\noexpand#1\noexpand#2}}%
++ \SOUL@addtoken{{\etex@unexpanded{#1#2}}}%
}%
- \SOUL@sosetletterskip
- \global\let\SOUL@soeventuallyskip\relax
+ \fi
+ \SOuL@next
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@soeverylowerthan}
-% Let \cs{\<} remove the last inter-letter skip. Set the kerning value
-% between the token before and that after the \cs{\<} command.
-%
-%
-% \begin{macrocode}
-\def\SOUL@soeverylowerthan{%
- \unskip
- \unpenalty
- \global\let\SOUL@soeventuallyskip\relax
- \SOUL@setkern\SOUL@charkern
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@sosetup}
-% Override all interface macros by our letterspacing versions. The
-% only unused macro is \cs{\SOUL@everysyllable}.
-%
-% \begin{macrocode}
-\def\SOUL@sosetup{%
- \SOUL@setup
- \let\SOUL@preamble\SOUL@sopreamble
- \let\SOUL@postamble\SOUL@sopostamble
- \let\SOUL@everytoken\SOUL@soeverytoken
- \let\SOUL@everyspace\SOUL@soeveryspace
- \let\SOUL@everyhyphen\SOUL@soeveryhyphen
- \let\SOUL@everyexhyphen\SOUL@soeveryexhyphen
- \let\SOUL@everylowerthan\SOUL@soeverylowerthan
+% \end{macro}
+% \begin{macro}{\SOuL@addthreeoctets}
+% \begin{macrocode}
+\def\SOuL@addthreeoctets#1#2#3{%
+ \def\SOuL@temp{#1#2#3}%
+ \@onelevel@sanitize\SOuL@temp
+ \ifx\SOuL@temp\SOuL@stringendash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{-}%
+ \SOUL@exhyphen{--}%
+ \let\SOuL@next\SOUL@scan
+ \else
+ \ifx\SOuL@temp\SOuL@stringemdash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{-}%
+ \SOUL@exhyphen{---}%
+ \let\SOuL@next\SOUL@scan
+ \else
+ \def\SOuL@next{%
+! \SOUL@addtoken{{\noexpand#1\noexpand#2\noexpand#3}}%
++ \SOUL@addtoken{{\etex@unexpanded{#1#2#3}}}%
+ }%
+ \fi
+ \fi
+ \SOuL@next
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@setso}
-% A handy macro for internal use.
-%
+% \end{macro}
+% \begin{macro}{\SOuL@addfouroctets}
% \begin{macrocode}
-\def\SOUL@setso#1#2#3{%
- \def\SOUL@soletterskip{#1}%
- \def\SOUL@soinnerskip{#2}%
- \def\SOUL@soouterskip{#3}%
+\def\SOuL@addfouroctets#1#2#3#4{%
+! \SOUL@addtoken{{\noexpand#1\noexpand#2\noexpand#3\noexpand#4}}%
++ \SOUL@addtoken{{\etex@unexpanded{#1#2#3#4}}}%
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\sodef}
-% This macro assigns the letterspacing skips as well as an optional
-% font switching command to a command sequence name. \cs{\so} itself
-% will be defined using this macro.
-%
-% \begin{macrocode}
-\def\sodef#1#2#3#4#5{%
- \DeclareRobustCommand*#1{\SOUL@sosetup
- \def\SOUL@preamble{%
- \SOUL@setso{#3}{#4}{#5}%
- #2%
- \SOUL@sopreamble
- }%
- \SOUL@
- }%
+% \end{macro}
+%
+% \subsubsection{Redefinition of \cs{SOUL@splittoken}}
+%
+% \begin{macro}{\SOUL@splittoken}
+% Macro \cs{SOUL@splittoken} separates the first token
+% or token group from a word and redefines the word to contain
+% the remaining tokens. However if the remaining tokens are
+% a token group, then the curly braces will be removed and
+% the token group is splitted by the next call of \cs{SOUL@splittoken}.
+% The redefinition avoids the removal of curly braces around the
+% remaining tokens.
+% \begin{macrocode}
+\SOuL@redefine\SOUL@splittoken#1#2\SOUL@stop{%
+ \global\SOUL@token={#1}%
+ \global\SOUL@word={#2}%
+}#1{%
+ \global\SOUL@token={#1}%
+ \SOuL@remainingtoken\relax
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\resetso}
-% Let \cs{\resetso} define reasonable default values for letterspacing.
-%
+% \end{macro}
+% \begin{macro}{\SOuL@remainingtoken}
% \begin{macrocode}
-\def\resetso{%
- \sodef\textso{}{.25em}{.65em\@plus.08em\@minus.06em}%
- {.55em\@plus.275em\@minus.183em}%
+\long\def\@gobble#1{}
+\def\SOuL@remainingtoken#1\SOUL@stop{%
+ \global\SOUL@word=\expandafter{\@gobble#1}%
}
-\resetso
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\sloppyword}
-% Set up a letterspacing macro that inserts slightly stretchable
-% space between the characters. This can be used to typeset long
-% words in narrow columns, where ragged paragraphs are undesirable.
-% See section~\ref{sec:sloppyword}.
-%
-% \begin{macrocode}
-\sodef\sloppyword{%
- \linepenalty10
- \hyphenpenalty10
- \adjdemerits\z@
- \doublehyphendemerits\z@
- \finalhyphendemerits\z@
- \emergencystretch.1em}%
- {\z@\@plus.1em}%
- {.33em\@plus.11em\@minus.11em}%
- {.33em\@plus.11em\@minus.11em}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection[The \texorpdfstring{\caps{caps}}{caps} driver]{The caps driver}
-%
-% \begin{macro}{\caps}
-% Unless run under \LaTeX, make \cs{\caps} just another simple letterspacing
-% macro that selects a font \cs{\capsfont} (defaulting to \cs{\relax}) but
-% doesn't have any special capabilities.
-%
-% \begin{macrocode}
-\ifx\documentclass\@undefined
-\let\capsfont\relax
-\let\capsreset\relax
-\def\capsdef#1#2#3#4#5{}
-\def\capssave#1{}
-\def\capsselect#1{}
-\sodef\textcaps{\capsfont}
- {.028em\@plus.005em\@minus.01em}%
- {.37em\@plus.1667em\@minus.111em}%
- {.37em\@plus.1em\@minus.14em}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\capsreset}
-% \dots\ else, if run under \LaTeX\ prepare a set of macros that
-% maintain a database with certain letterspacing values for different
-% fonts. \cs{\capsreset} clears the database and inserts a default rule.
-%
-% \begin{macrocode}
-\else
-\DeclareRobustCommand*\capsreset{%
- \let\SOUL@capsbase\empty
- \SOUL@capsdefault
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\capsdef}
-% Add an entry to the database, which is of course nothing else than
-% a \TeX\ macro. See section ``List macros'' of appendix~D in the
-% \TeX{}book~\cite{DEK} for details.
-%
-% \begin{macrocode}
-\def\capsdef#1#2#3#4#5{{%
- \toks\z@{\\{#1/#2/#3/#4/#5}}%
- \toks\tw@=\expandafter{\SOUL@capsbase}%
- \xdef\SOUL@capsbase{\the\toks\z@\the\toks\tw@}%
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\capssave}
-% \begin{macro}{\capsselect}
-% Save the current database in a macro within the |SOUL@| namespace
-% and let |\capsselect| restore this database.
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\capssave[1]{%
- \expandafter\global\expandafter\let
- \csname SOUL@db@#1\endcsname\SOUL@capsbase
-}
-\DeclareRobustCommand*\capsselect[1]{%
- \expandafter\let\expandafter\SOUL@capsbase
- \csname SOUL@db@#1\endcsname
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@capsfind}
-% \begin{macro}{\SOUL@caps}
-% Go through the database entries and pick the first entry that matches
-% the currently active font. Then define an internal macro that uses
-% the respective spacing values in a macro that is equivalent to the
-% \cs{\textso} command.
-%
-% \begin{macrocode}
-\def\SOUL@capsfind#1/#2/#3/#4/#5/#6/#7/#8/#9/{%
- \let\SOUL@match=1%
- \SOUL@chk{#1}\f@encoding
- \SOUL@chk{#2}\f@family
- \SOUL@chk{#3}\f@series
- \SOUL@chk{#4}\f@shape
- \SOUL@dimchk{#5}\f@size
- \if\SOUL@match1%
- \let\\\@gobble
- \gdef\SOUL@caps{%
- \SOUL@sosetup
- \def\SOUL@preamble{\SOUL@setso{#7}{#8}{#9}#6%
- \SOUL@sopreamble}%
- \SOUL@}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@chk}
-% Sets the \cs{\SOUL@match} flag if both parameters are equal.
-% This is used for all \caps{\small NFSS} elements except the font size.
-%
-% \begin{macrocode}
-\def\SOUL@chk#1#2{%
- \if$#1$%
- \else
- \def\SOUL@n{#1}%
- \ifx#2\SOUL@n\else\let\SOUL@match=0\fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@dimchk}
-% \begin{macro}{\SOUL@rangechk}
-% We do not only want to check if a given font size |#1| matches |#2|,
-% but also if it fits into a given range. An omitted lower boundary
-% is replaced by \cs{\z@} and an omitted upper boundary by \cs{\maxdimen}.
-% The first of a series of \cs{\SOUL@chk} and \cs{\SOUL@dimchk}
-% statements, which detects that the arguments don't match, sets the
-% \cs{\SOUL@match} flag to zero. A value of~1 indicates that an
-% entry in the font database matches the currently used font.
-%
-% \begin{macrocode}
-\def\SOUL@dimchk#1#2{\if$#1$\else\SOUL@rangechk{#2}#1--\@ne\@@\fi}
-\def\SOUL@rangechk#1#2-#3-#4\@@{%
- \count@=#4%
- \ifnum\count@>\z@
- \ifdim#1\p@=#2\p@\else\let\SOUL@match=0\fi
- \else
- \dimen@=\if$#2$\z@\else#2\p@\fi
- \ifdim#1\p@<\dimen@\let\SOUL@match=0\fi
- \dimen@=\if$#3$\maxdimen\else#3\p@\fi
- \ifdim#1\p@<\dimen@\else\let\SOUL@match=0\fi
- \fi
+% \end{macro}
+%
+% \subsection{Patches}
+%
+% The fixed \cs{SOUL@splittoken} allows to remove the double
+% sets of curly braces in other macros of package \xpackage{soul-ori}.
+% The benefit is that implicite kernings are more often detected
+% and fixes a bug in package \xpackage{soul-ori}. The disadvantage is
+% incompatibility. The width of the resulting strings may change.
+% \begin{macro}{\SOUL@flushcomma}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@flushcomma{%
+ \ifcase\SOUL@comma
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word,}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
+ \fi
+ \SOUL@comma\z@
+}{%
+ \ifcase\SOUL@comma
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word,}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{,,}}}\x
+ \fi
+ \SOUL@comma\z@
}
% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\textcaps}
-% Find a matching entry in the database and start the letterspacing
-% mechanism with the given spacing values.
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\textcaps{{%
- \def\\##1{\expandafter\SOUL@capsfind##1/}%
- \SOUL@capsbase
- \aftergroup\SOUL@caps
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@capsdefault}
-% Define a default database entry and a default font.
-%
-% \begin{macrocode}
-\def\SOUL@capsdefault{%
- \capsdef{////}%
- \SOUL@capsdfltfnt
- {.028em\@plus.005em\@minus.01em}%
- {.37em\@plus.1667em\@minus.1em}%
- {.37em\@plus.111em\@minus.14em}%
+% \end{macro}
+% \begin{macro}{\SOUL@flushapo}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@flushapo{%
+ \ifcase\SOUL@apo
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word'}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
+ \fi
+ \SOUL@apo\z@
+}{%
+ \ifcase\SOUL@apo
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word'}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{''}}}\x
+ \fi
+ \SOUL@apo\z@
}
-\let\SOUL@capsdfltfnt\scshape
-\capsreset
-\fi
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The \texorpdfstring{\ul{underlining}}{underlining} driver}
-%
-% \begin{macro}{\SOUL@ulleaders}
-% This macro sets the underline under the following \cs{\hskip}.
-%
-% \begin{macrocode}
-\newdimen\SOUL@uldp
-\newdimen\SOUL@ulht
-\def\SOUL@ulleaders{%
- \leaders\hrule\@depth\SOUL@uldp\@height\SOUL@ulht\relax
+% \end{macro}
+% \begin{macro}{\SOUL@flushgrave}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@flushgrave{%
+ \ifcase\SOUL@grave
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word`}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
+ \fi
+ \SOUL@grave\z@
+}{%
+ \ifcase\SOUL@grave
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word`}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{``}}}\x
+ \fi
+ \SOUL@grave\z@
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulunderline}
-% Set an underline under the given material. It draws the line first,
-% and the given material afterwards. This is needed for highlighting,
-% but gives less than optimal results for colored overstriking, which,
-% however, will hardly ever be used, anyway.
-%
-% \begin{macrocode}
-\def\SOUL@ulunderline#1{{%
- \setbox\z@\hbox{#1}%
- \dimen@=\wd\z@
- \dimen@i=\SOUL@uloverlap
- \advance\dimen@2\dimen@i
- \rlap{%
- \null
- \kern-\dimen@i
- \SOUL@ulcolor{\SOUL@ulleaders\hskip\dimen@}%
+% \end{macro}
+% \begin{macro}{\SOUL@addgroup}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@addgroup#1#2{%
+ {%
+ \let\protect\noexpand
+ \edef\x{%
+ \global\SOUL@word={%
+ \the\SOUL@word
+ {{\noexpand#1#2}}%
+ }%
}%
- \unhcopy\z@
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulpreamble}
-% Just set up the line dimensions and the space skip. Normally,
-% \cs{\spaceskip} is unset and not used by \TeX. We need it, though,
-% because we feed it to the \cs{\leaders} primitive.
-%
-% \begin{macrocode}
-\def\SOUL@ulpreamble{%
- \SOUL@uldp=\SOUL@uldepth
- \SOUL@ulht=-\SOUL@uldp
- \advance\SOUL@uldp\SOUL@ulthickness
- \spaceskip\SOUL@spaceskip
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleverysyllable}
-% By using \cs{\SOUL@everysyllable} we don't have to care about
-% kerning values and get better results for highlighting, where
-% negative kerning values would otherwise cut off characters.
-%
-% \begin{macrocode}
-\def\SOUL@uleverysyllable{%
- \SOUL@ulunderline{%
- \the\SOUL@syllable
- \SOUL@setkern\SOUL@charkern
+ \x
+ }%
+ \SOUL@scan
+}#1#2{%
+ \begingroup
+ \let\protect\noexpand
+ \edef\x{\endgroup
+ \SOUL@word={%
+ \the\SOUL@word
+! {\noexpand#1{#2}}%
++ {\etex@unexpanded{#1{#2}}}%
+ }%
}%
+ \x
+ \SOUL@scan
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleveryspace}
-% Set a given penalty and an underlined \cs{\space} equivalent.
-% The \cs{\null} prevents a nasty gap in |\textfrak| |{a \textswab{b}}|,
-% while it doesn't seem to hurt in all other cases. I didn't investigate
-% this.
-%
-% \begin{macrocode}
-\def\SOUL@uleveryspace#1{%
- \SOUL@ulcolor{%
- #1%
- \SOUL@ulleaders
- \hskip\spaceskip
+% \end{macro}
+% \begin{macro}{\SOUL@addmath}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@addmath$#1${%
+ {%
+ \let\protect\noexpand
+ \edef\x{%
+ \global\SOUL@word={%
+ \the\SOUL@word
+ {{\hbox{$#1$}}}%
+ }%
}%
- \null
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleveryhyphen}
-% If hyphenation takes place, output an underlined hyphen with the
-% required hyphen kerning value.
-%
-% \begin{macrocode}
-\def\SOUL@uleveryhyphen{%
- \discretionary{%
- \unkern
- \SOUL@ulunderline{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@sethyphenchar
- }%
- }{}{}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@uleveryexhyphen}
-% Underline the given hyphen, en-dash, em-dash or \cs{\slash} and care
-% for kerning.
-%
-% \begin{macrocode}
-\def\SOUL@uleveryexhyphen#1{%
- \SOUL@setkern\SOUL@hyphkern
- \SOUL@ulunderline{#1}%
- \discretionary{}{}{%
- \SOUL@setkern\SOUL@charkern
+ \x
+ }%
+ \SOUL@scan
+}$#1${%
+ \begingroup
+ \let\protect\noexpand
+ \edef\x{\endgroup
+ \SOUL@word={%
+ \the\SOUL@word
+! {\hbox{$#1$}}%
++ {\etex@unexpanded{\hbox{$#1$}}}%
+ }%
}%
+ \x
+ \SOUL@scan
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulcolor}
-% \begin{macro}{\setulcolor}
-% Define the underline color or turn off coloring, in which case the lines are not
-% just colored black, but remain uncolored. This makes them appear
-% black, nevertheless, and has the advantage, that no Postscript
-% \cs{\specials} are cluttering the output.
-%
-% \begin{macrocode}
-\let\SOUL@ulcolor\relax
-\def\setulcolor#1{%
- \if$#1$
- \let\SOUL@ulcolor\relax
- \else
- \def\SOUL@ulcolor{\textcolor{#1}}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\setuloverlap}
-% \begin{macro}{\SOUL@uloverlap}
-% Set the overlap amount, that helps to avoid gaps on sloppy output
-% devices.
-%
-% \begin{macrocode}
-\def\setuloverlap#1{\def\SOUL@uloverlap{#1}}
-\setuloverlap{.25pt}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@ulsetup}
-% The underlining driver is quite simple. No need for \cs{\SOUL@postamble}
-% and \cs{\SOUL@everytoken}.
-%
-% \begin{macrocode}
-\def\SOUL@ulsetup{%
- \SOUL@setup
- \let\SOUL@preamble\SOUL@ulpreamble
- \let\SOUL@everysyllable\SOUL@uleverysyllable
- \let\SOUL@everyspace\SOUL@uleveryspace
- \let\SOUL@everyhyphen\SOUL@uleveryhyphen
- \let\SOUL@everyexhyphen\SOUL@uleveryexhyphen
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@textul}
-% Describing self-explanatory macros is \emph{so} boring!
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\textul{\SOUL@ulsetup\SOUL@}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\setul}
-% \begin{macro}{\SOUL@uldepth}
-% \begin{macro}{\SOUL@ulthickness}
-% Set the underlining dimensions. Either value may be omitted and
-% lets the respective macro keep its current contents.
-%
-% \begin{macrocode}
-\def\setul#1#2{%
- \if$#1$\else\def\SOUL@uldepth{#1}\fi
- \if$#2$\else\def\SOUL@ulthickness{#2}\fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\resetul}
-% Set reasonable default values that fit most latin fonts.
-%
-% \begin{macrocode}
-\def\resetul{\setul{.65ex}{.1ex}}
-\resetul
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\setuldepth}
-% This macro sets all designated ``letters'' (\cs{\catcode=11}) or the
-% given material in a box and sets the underlining dimensions according
-% to the box depth.
-%
-% \begin{macrocode}
-\def\setuldepth#1{{%
- \def\SOUL@n{#1}%
- \setbox\z@\hbox{%
- \tracinglostchars\z@
- \ifx\SOUL@n\empty
- \count@\z@
- \loop
- \ifnum\catcode\count@=11\char\count@\fi
- \ifnum\count@<\@cclv
- \advance\count@\@ne
- \repeat
- \else
- #1%
- \fi
+% \end{macro}
+% \begin{macro}{\SOUL@addprotect}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@addprotect#1#2{%
+ {%
+ \let\protect\noexpand
+ \edef\x{%
+ \global\SOUL@word={%
+ \the\SOUL@word
+ {{\hbox{#2}}}%
+ }%
}%
- \dimen@\dp\z@
- \advance\dimen@\p@
- \xdef\SOUL@uldepth{\the\dimen@}%
-}}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The \texorpdfstring{\st{overstriking}}{overstriking} driver}
-%
-% \begin{macro}{\SOUL@stpreamble}
-% Striking out is just underlining with a raised line of a different
-% color. Hence we only need to define the preamble accordingly and
-% let the underlining preamble finally do its job. Not that colored
-% overstriking was especially useful, but we want at least to keep
-% it black while we might want to set underlines in some fancy color.
-%
-% \begin{macrocode}
-\def\SOUL@stpreamble{%
- \dimen@\SOUL@ulthickness
- \dimen@i=-.5ex
- \advance\dimen@i-.5\dimen@
- \edef\SOUL@uldepth{\the\dimen@i}%
- \let\SOUL@ulcolor\SOUL@stcolor
- \SOUL@ulpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@stsetup}
-% We re-use the whole underlining setup and just replace the preamble
-% with our modified version.
-%
-% \begin{macrocode}
-\def\SOUL@stsetup{%
- \SOUL@ulsetup
- \let\SOUL@preamble\SOUL@stpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\textst}
-% These pretzels are making me thirsty \dots
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\textst{\SOUL@stsetup\SOUL@}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@stcolor}
-% \begin{macro}{\setstcolor}
-% Set the overstriking color. This won't be used often, but is required
-% in cases, where the underlines are colored. You wouldn't want to
-% overstrike in the same color. Note that overstriking lines are
-% drawn \emph{beneath} the text, hence bright colors won't look good.
-%
-% \begin{macrocode}
-\let\SOUL@stcolor\relax
-\def\setstcolor#1{%
- \if$#1$
- \let\SOUL@stcolor\relax
- \else
- \def\SOUL@stcolor{\textcolor{#1}}%
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection{The highlighting driver}
-%
-% \begin{macro}{\SOUL@hlpreamble}
-% This is nothing else than overstriking with very thick lines.
-%
-% \begin{macrocode}
-\def\SOUL@hlpreamble{%
- \setul{}{2.5ex}%
- \let\SOUL@stcolor\SOUL@hlcolor
- \SOUL@stpreamble
-}
-% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\SOUL@hlsetup}
-% No need to re-invent the wheel. Just use the overstriking setup
-% with a different preamble.
-%
-% \begin{macrocode}
-\def\SOUL@hlsetup{%
- \SOUL@stsetup
- \let\SOUL@preamble\SOUL@hlpreamble
+ \x
+ }%
+ \SOUL@scan
+}#1#2{%
+ \begingroup
+ \let\protect\noexpand
+ \edef\x{\endgroup
+ \SOUL@word={%
+ \the\SOUL@word
+! {\hbox{#2}}%
++ {\etex@unexpanded{\hbox{#2}}}%
+ }%
+ }%
+ \x
+ \SOUL@scan
}
% \end{macrocode}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \begin{macro}{\texthl}
-% \begin{macro}{\sethlcolor}
-% \begin{macro}{\SOUL@hlcolor}
-% Define the highlighting macro and the color setting macro with a
-% simple default color. Yellow isn't really pleasing, but it's already
-% predefined by the \package{color} package.
-%
-% \begin{macrocode}
-\DeclareRobustCommand*\texthl{\SOUL@hlsetup\SOUL@}
-\def\sethlcolor#1{\if$#1$\else\def\SOUL@hlcolor{\textcolor{#1}}\fi}
-\sethlcolor{yellow}
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \subsection*{The package postamble}
-%
-% \begin{macro}{\so}
-% \begin{macro}{\ul}
-% \begin{macro}{\st}
-% \begin{macro}{\hl}
-% \begin{macro}{\caps}
-% OK, I lied. The short macro names are just abbreviations for their
-% longer counterpart. Some people might be used to |\text*| style commands
-% to select a certain font. And then it doesn't hurt to reserve
-% these early enough.
-%
-% \begin{macrocode}
-\let\so\textso
-\let\ul\textul
-\let\st\textst
-\let\hl\texthl
-\let\caps\textcaps
-% \end{macrocode}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-% \end{macro}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
-%
-% \noindent
-% When used in an environment other than \LaTeX\ and the \package{german}
-% package was already loaded, define the double quotes as accent.
-%
-% \begin{macrocode}
-\ifx\documentclass\@undefined
- \ifx\mdqoff\@undefined
- \else
- \soulaccent{"}%
- \fi
- \catcode`\@=\atcode
-% \end{macrocode}
-%
-%
-%
-%
-%^^A--------------------------------------------------------------------
-%
-%
-%
+% \end{macro}
+%
+% \begin{macro}{\SOUL@addtoken}
+% \begin{macrocode}
++ \SOuL@redefine\SOUL@addtoken#1{%
++ \edef\x{%
++ \SOUL@word={%
++ \the\SOUL@word
++ \noexpand#1%
++ }%
++ }%
++ \x
++ \SOUL@scan
++ }#1{%
++ \edef\x{%
++ \SOUL@word={%
++ \the\SOUL@word
++ \etex@unexpanded{#1}%
++ }%
++ }%
++ \x
++ \SOUL@scan
++ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\SOuL@AtEnd%
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\CTANpkg{soul}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/soul/soul.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/soul/soul-ori.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/soul/soul.pdf}] Documentation.
+% \end{description}
+%
+%
+% \subsection{Package installation}
+%
+% Install the package with the package manager of your TeXsystem.
+% If you want to do it manually:
+%
+% \paragraph{Unpacking.}
+% Run tex or \LaTeX{} on the \xfile{.ins} file
+% \begin{quote}
+% \verb|tex soul.ins|
+% \end{quote}
+%
+% \paragraph{TDS.} Now the different files must be moved into
+% the different directories in your installation TDS tree
+% (also known as \xfile{texmf} tree):
+% \begin{quote}
+% \def\t{^^A
+% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
+% soul.sty & tex/generic/soul/soul.sty\\
+% soul-ori.sty & tex/generic/soul/soul-ori.sty\\
+% soulutf8.sty & tex/latex/soul/soulutf8.sty\\
+% soul.pdf & doc/generic/soul/soul.pdf\\
+% soul-ori.pdf & doc/generic/soul/soul-ori.pdf\\
+% soul.dtx & source/generic/soul/soul.dtx\\
+% soulori.dtx & source/generic/soul/soul-ori.dtx\\
+% \end{tabular}^^A
+% }^^A
+% \sbox0{\t}^^A
+% \ifdim\wd0>\linewidth
+% \begingroup
+% \advance\linewidth by\leftmargin
+% \advance\linewidth by\rightmargin
+% \edef\x{\endgroup
+% \def\noexpand\lw{\the\linewidth}^^A
+% }\x
+% \def\lwbox{^^A
+% \leavevmode
+% \hbox to \linewidth{^^A
+% \kern-\leftmargin\relax
+% \hss
+% \usebox0
+% \hss
+% \kern-\rightmargin\relax
+% }^^A
+% }^^A
+% \ifdim\wd0>\lw
+% \sbox0{\small\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\footnotesize\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\scriptsize\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\tiny\t}^^A
+% \ifdim\wd0>\linewidth
+% \lwbox
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \end{quote}
+% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
+% TDS installing feature, then some files can already be in the right
+% place, see the documentation of \docstrip.
%
-% \noindent
-% If we have been loaded by a \LaTeX\ environment and the \package{color}
-% package wasn't also loaded, we disable all colors. Then we add the umlaut accent
-% |"| if the \package{german} package is present. The quotes character has to
-% be \cs{\catcode}'d \cs{\active} now, or it won't get recognized later.
-% The \option{capsdefault}
-% option overrides the \cs{\caps} driver and lets \cs{\SOUL@} set an underline.
-% Finally load the local configuration, process the |capsdefault|
-% option and exit.
+% \subsection{Refresh file name databases}
%
-% \begin{macrocode}
-\else
- \bgroup
- \catcode`\"\active
- \AtBeginDocument{%
- \@ifundefined{color}{%
- \let\SOUL@color\relax
- \let\setulcolor\@gobble
- \let\setstcolor\@gobble
- \let\sethlcolor\@gobble
- \let\hl\ul
- }{}
- \@ifundefined{mdqoff}{}{\soulaccent{"}}
- }
- \egroup
- \DeclareOption{capsdefault}{%
- \AtBeginDocument{%
- \def\SOUL@capsdfltfnt#1{%
- \SOUL@ulsetup
- \SOUL@ulpreamble
- \scshape
- }%
- }%
- }
- \InputIfFileExists{soul.cfg}%
- {\PackageInfo{soul}{Local config file soul.cfg used}}{}
- \ProcessOptions
-\fi
-\endinput
-% \end{macrocode}
+% If your \TeX~distribution
+% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \TeX\,Live\ users run \verb|texhash| or
+% \verb|mktexlsr|.
%
%
+% \begin{thebibliography}{9}
%
+% \bibitem{soul}
+% Melchior Franz: \textit{The \xpackage{soul} package};
+% 2003/11/17;\\
+% \CTANpkg{soul}.
%
-%^^A--------------------------------------------------------------------
+% \bibitem{ucs}
+% Dominique P. G. Unruh: \textit{\xpackage{ucs.sty} -- Unicode Support};
+% 2004/10/17;\\
+% \CTANpkg{unicode}.
%
+% \bibitem{utf8}
+% Frank Mittelbach, Chris Rowley:
+% \textit{Providing some UTF-8 support via \xpackage{inputenc}};
+% 2006/03/30;\\
+% \CTAN{macros/latex/base/utf8ienc.dtx}.
%
+% \end{thebibliography}
%
+% \begin{History}
+% \begin{Version}{2007/09/09 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \begin{Version}{2016/05/16 v1.1}
+% \item
+% Documentation updates.
+% \end{Version}
+% \begin{Version}{2019/12/15 v1.2}
+% \item
+% Documentation updates.
+% \end{Version}
+% \begin{Version}{2023-02-18 v3.0}
+% \item merged soulutf8 and the original soul into one package.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
%
-% \vspace{2explus1fill}
-%\begin{verbatim}
-%$Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel $
-%\end{verbatim}
% \Finale
-%
-%
-% ^^A.E.I.O.U.^^
-%^^A vim:ts=4:sw=4:et
+\endinput
diff --git a/macros/generic/soul/soul.ins b/macros/generic/soul/soul.ins
index 451343f7df..ff0b495361 100644
--- a/macros/generic/soul/soul.ins
+++ b/macros/generic/soul/soul.ins
@@ -1,10 +1,73 @@
-%% LaTeX2e file `soul.ins'
-%% generated by the `filecontents' environment
-%% from source `soul' on 2003/11/17.
-%%
-\def\batchfile{soul.ins}
-\input docstrip.tex
+\iffalse meta-comment
+
+File: soul.ins
+
+Copyright (C) 1998--2003 Melchior FRANZ
+Copyright (C) 2007 Heiko Oberdiek
+Copyright (C) 2022-2023 Oberdiek Package Support Group
+
+It may be distributed and/or modified under the conditions of the
+LaTeX Project Public License (LPPL), either version 1.3c of this
+license or (at your option) any later version. The latest version
+of this license is in the file
+
+ https://www.latex-project.org/lppl.txt
+
+This file is part of the "soul bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+The released version of this bundle is available from CTAN.
+
+-----------------------------------------------------------------------
+
+The development version of the bundle can be found at
+
+ https://github.com/ho-tex/soul
+
+for those people who are interested.
+
+-----------------------------------------------------------------------
+
+\fi
+
+\input l3docstrip.tex
\askforoverwritefalse
-\keepsilent % <-- this is for you, Christina ;-)
-\generate{\file{soul.sty}{\from{soul.dtx}{package}}}
+
+\let\MetaPrefix\relax
+\preamble
+
+Copyright (C) 1998--2003 Melchior FRANZ
+Copyright (C) 2007 Heiko Oberdiek
+Copyright (C) 2022-2023 Oberdiek Package Support Group
+
+It may be distributed and/or modified under the conditions of
+the LaTeX Project Public License (LPPL), either version 1.3c of
+this license or (at your option) any later version. The latest
+version of this license is in the file:
+
+ https://www.latex-project.org/lppl.txt
+
+This file is part of the "soul bundle" (The Work in LPPL)
+and all files in that bundle must be distributed together.
+
+\endpreamble
+\let\MetaPrefix\DoubleperCent
+% stop docstrip adding \endinput
+\postamble
+\endpostamble
+
+\keepsilent
+
+\generate
+ {\file{soul.sty}
+ {
+ \from{soul.dtx}{package}
+ }
+ }
+
+\generate
+ {\file{soul-ori.sty}{\from{soul-ori.dtx}{package}}}
+
+\generate
+ {\file{soulutf8.sty}{\from{soul.dtx}{soulutf8}}}
\endbatchfile
diff --git a/macros/generic/soul/soul.pdf b/macros/generic/soul/soul.pdf
index d60e6ba326..0f5eab35cd 100644
--- a/macros/generic/soul/soul.pdf
+++ b/macros/generic/soul/soul.pdf
Binary files differ
diff --git a/macros/latex/contrib/nicematrix/nicematrix-french.pdf b/macros/latex/contrib/nicematrix/nicematrix-french.pdf
index 54cdad4646..0d115788fc 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 1adb3a823d..5f3101b372 100644
--- a/macros/latex/contrib/nicematrix/nicematrix-french.tex
+++ b/macros/latex/contrib/nicematrix/nicematrix-french.tex
@@ -151,7 +151,7 @@ pour être utilisées à la compilation suivante. C'est pourquoi l'utilisation d
\medskip
La plupart des fonctionnalités de \pkg{nicematrix} sont accessibles sans avoir à
-utiliser explicitement \textsc{pgf} ou Tikz (ce dernier n'est d'ailleurs pas
+utiliser explicitement \textsc{pgf} ou TikZ (ce dernier n'est d'ailleurs pas
chargé par défaut).
\medskip
@@ -487,36 +487,10 @@ $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
\end{bNiceArray}$
-\medskip
-On peut régler le positionnement horizontal du bloc avec l'une des clés |l|, |c| et |r|.
-
-
-\medskip
-\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-\Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
-& & & \Vdots \\
-& & & 0 \\
-\hline
-0 & \Cdots& 0 & 0
-\end{bNiceArray}$
-\end{BVerbatim}
-$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-\Block[r]{3-3}<\LARGE>{A} & & & 0 \\
-& & & \Vdots \\
-& & & 0 \\
-\hline
-0 & \Cdots& 0 & 0
-\end{bNiceArray}$
-
-
-
\interitem
-La commande |\Block| accepte en fait en premier argument optionnel (entre
-crochets) une liste de couples \textsl{clé=valeur}. Les clés sont les suivantes :
+La commande |\Block| accepte en premier argument optionnel (entre crochets) une
+liste de couples \textsl{clé=valeur}. Les clés sont les suivantes :
\begin{itemize}
-\item les clés |l|, |c| et |r| réglent le positionnement horizontal comme dit
-précédemment ;
\item la clé |fill| prend en argument une couleur et remplit le bloc avec cette
couleur ;
\item la clé |draw| prend en argument une couleur et trace le cadre avec cette
@@ -533,29 +507,30 @@ d'intérêt que si |draw|, |hvlines|, |hlines| ou |vlines| est utilisée) ;
\item la clé |rounded-corners| impose des coins arrondis (pour le cadre dessiné
par |draw| et le fond dessiné par |fill|) avec un rayon égal à la valeur de
cette clé (la valeur par défaut est 4~pt\footnote{Cette valeur par défaut est la
- valeur initiale des \emph{rounded corners} de Tikz.}) ;
-\item les clés |t| et |b| réglent la ligne de base qui sera donnée au bloc quand
-celui-ci est constitué de plusieurs lignes (séparées par la commande |\\|) ;
-\item quand la clé |tikz| est utilisée, le chemin Tikz correspondant au
-rectangle délimitant le bloc est exécuté avec Tikz\footnote{Tikz doit être
+ valeur initiale des \emph{rounded corners} de TikZ.}) ;
+\item quand la clé |tikz| est utilisée, le chemin TikZ correspondant au
+rectangle délimitant le bloc est exécuté avec TikZ\footnote{TikZ doit être
chargé préalablement (par défaut, \pkg{nicematrix} ne charge que
\textsc{pgf}), faute de quoi, une erreur sera levée.} en utilisant comme
-options la valeur de cette clé |tikz| (qui doit donc être une liste de clés Tikz
-applicables à un chemin de Tikz). Pour des exemples d'utilisation de cette clé
+options la valeur de cette clé |tikz| (qui doit donc être une liste de clés TikZ
+applicables à un chemin de TikZ). Pour des exemples d'utilisation de cette clé
|tikz|, voir p.~\pageref{tikz-key-examples} ;
-\item la clé |name| donne un nom au nœud Tikz rectangulaire correspondant au
-bloc ; on peut utiliser ce nom avec Tikz dans le |\CodeAfter| (cf.~p.~\pageref{code-after});
+\item la clé |name| donne un nom au nœud TikZ rectangulaire correspondant au
+bloc ; on peut utiliser ce nom avec TikZ dans le |\CodeAfter| (cf.~p.~\pageref{code-after});
\item la clé |respect-arraystretch| évite la remise à $1$ de |\arraystretch| en
début de bloc (qui a lieu par défaut) ;
\item la clé |borders| permet de ne tracer que certaines des bordures du bloc :
cette clé prend comme valeur une liste d'éléments parmi les suivants : |left|,
|right|, |top| et |bottom| ; on peut en fait, dans la liste qui est la valeur de
la clé |borders| mettre une entrée de la forme |tikz={|\textsl{liste}|}| où
-\textsl{liste} est une liste de couples \textsl{clé=valeur} de Tikz spécifiant
+\textsl{liste} est une liste de couples \textsl{clé=valeur} de TikZ spécifiant
les caractéristiques graphiques des traits qui seront dessinés (pour un exemple,
voir p.~\pageref{tiretes}).
\end{itemize}
+Il existe aussi des clés de positionnement horizontal et vertical du bloc qui
+sont décrites ci-dessous (cf. \ref{horizontal-bloc} p.~\pageref{horizontal-bloc}).
+
\interitem
\textbf{On doit remarquer que, par défaut, les blocs ne créent pas d'espace}. Il
@@ -606,7 +581,8 @@ cette largeur.
\item La spécification d'alignement horizontal donnée par le type de
colonne (|c|, |r| ou |l|) est prise en compte pour le bloc (mais le bloc peut
-avoir sa propre spécification d'alignement horizontal).
+avoir sa propre spécification d'alignement horizontal :
+cf.~\ref{horizontal-bloc} p.~\pageref{horizontal-bloc}).
\item Les spécifications de fontes imposées à une colonne via la construction
|>{...}| dans le préambule du tableau sont prises en compte pour les
@@ -653,8 +629,6 @@ Pour les blocs mono-rangée, la hauteur (\emph{height}) et la profondeur
la rangée en cours (comme le fait la commande standard |\multicolumn| de LaTeX).
-
-
\subsection{Les blocs mono-case}
Les blocs mono-case héritent des caractéristiques des blocs mono-colonne et
@@ -669,7 +643,7 @@ fait, il y a plusieurs situations où leur utilisation peut présenter des avant
bloc sur plusieurs lignes.
\item On peut utiliser l'option d'alignement horizontal du bloc pour déroger à
-la consigne générale donnée dans le préambule pour cette colonne.
+la consigne générale donnée dans le préambule pour cette colonne (cf.~\ref{horizontal-bloc} p.~\pageref{horizontal-bloc}).
\item On peut tracer un cadre autour du bloc avec la clé |draw| de la commande
|\Block| ou colorier le fond avec des bords arrondis avec les clés |fill| et
@@ -711,6 +685,30 @@ défaut de ce premier argument obligatoire est |1-1|.}.
\subsection{Positionnement horizontal du contenu des blocs}
+\label{horizontal-bloc}
+
+La commande |\Block| admet les clés |l|, |c| et |r| pour la position horizontale
+du contenu du bloc (calé à gauche, centré ou bien calé à droite).
+
+\medskip
+\begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+\end{BVerbatim}
+$\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+\Block[r]{3-3}<\LARGE>{A} & & & 0 \\
+& & & \Vdots \\
+& & & 0 \\
+\hline
+0 & \Cdots& 0 & 0
+\end{bNiceArray}$
+
+\bigskip
Par défaut, le positionnement horizontal des contenus des blocs est calculé sur
le \emph{contenu} des colonnes impliquées. De ce fait, dans l'exemple suivant,
l'en-tête «Premier groupe» est correctement centré même si un espacement
@@ -755,6 +753,168 @@ Pour avoir un positionnement horizontal du contenu du bloc qui s'appuie sur les
limites des colonnes du tableau LaTeX (et non sur le contenu de ces colonnes),
il faut utiliser les clés |L|, |R| et |C| de la commande |\Block|.
+\medskip
+Voici le même exemple avec la clé |C| pour le premier bloc.
+
+\begin{center}
+\fvset{commandchars=\~\#\+}
+\begin{BVerbatim}
+\begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc~@{}}
+\toprule
+Rang & ~emphase#\Block[C]{1-3}{Premier groupe}+ & & & \Block{1-3}{Deuxième groupe} \\
+ & 1A & 1B & 1C & 2A & 2B & 2C \\
+\midrule
+ 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+ 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+ 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+ 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+\bottomrule
+\end{NiceTabular}
+\end{BVerbatim}
+\end{center}
+
+\medskip
+\begin{center}
+\begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
+\toprule
+Rang & \Block[C]{1-3}{Premier groupe} & & & \Block{1-3}{Deuxième groupe} \\
+ & 1A & 1B & 1C & 2A & 2B & 2C \\
+\midrule
+ 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+ 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+ 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+ 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+\bottomrule
+\end{NiceTabular}
+\end{center}
+
+
+
+\subsection{Positionnement vertical du contenu des blocs}
+
+\colorbox{yellow!50}{\textbf{Nouveau 6.14}}
+
+Concernant le positionnement vertical, la commande |\Block| admet les clés
+|v-center|\footnote{Cette clé ne peut être nommée \texttt{c} car la clé
+ \texttt{c} est déjà prise pour le positionnement horizontal.}, |t|, |b|, |T| et~|B|.
+
+
+\begin{itemize}
+\item Avec la clé |v-center|, le contenu du bloc est centré verticalement.
+
+\item Avec la clé |t|, la ligne de base du contenu du bloc est alignée avec la
+ligne de base de la première rangée concernée par le bloc.
+
+\item Avec la clé |b|, la ligne de base de la dernière rangée du contenu du bloc
+(rappelons que le contenu du bloc peut comporter plusieurs rangées séparées par
+|\\|) est alignée avec la ligne de base de la dernière des rangées du tableau
+impliquées dans le bloc.
+
+\item Avec la clé |T|, le contenu du bloc est calé vers le haut (avec une marge
+égale au paramètre |inner ysep| de PGF/Tikz).
+
+\item Avec la clé |B|, le contenu du bloc est calé vers le bas (avec une marge
+égale au paramètre |inner ysep| de PGF/Tikz).
+\end{itemize}
+
+Quand aucune clé n'est donnée, c'est la clé |v-center| qui s'applique (sauf pour
+les blocs mono-rangée).
+
+\medskip
+\begin{scope}
+\NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
+
+\begin{BVerbatim}
+\NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
+\end{BVerbatim}
+
+\bigskip
+
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#t@,l]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,t,l]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#b@,r]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,b,r]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#T@,l]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,T,l]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+
+
+\bigskip
+\begin{BVerbatim}[baseline=c,boxwidth=10cm]
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,~emphase#B@,r]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+\end{BVerbatim}
+\begin{NiceTabular}{ccc}
+\Block[fill=red!10,B,r]{4-2}{two\\lines}
+ & & \Huge first\\
+ & & second \\
+ & & third \\
+ & & fourth \\
+text & text \\
+\end{NiceTabular}
+
+\end{scope}
+
+
+
\section{Les filets horizontaux et verticaux}
\label{rules}
@@ -972,10 +1132,9 @@ p.~\pageref{corners}.
En particulier, cette remarque explique la différence entre la commande standard
|\hline| et la commande |\Hline| proposée par \pkg{nicematrix}.
-\colorbox{yellow!50}{\textbf{Nouveau 6.13}}\enskip La commande |\Hline| admet
-entre crochets un argument optionnel qui est une liste de couples
-\textsl{clé=valeur} qui décrivent un filet. Pour la description de ces clés,
-voir |custom-line| p.~\pageref{custom-line}.
+La commande |\Hline| admet entre crochets un argument optionnel qui est une
+liste de couples \textsl{clé=valeur} qui décrivent un filet. Pour la description
+de ces clés, voir |custom-line| p.~\pageref{custom-line}.
\medskip
\subsubsection{Les clés hlines et vlines}
@@ -1190,15 +1349,14 @@ qui permettront d'utiliser ce nouveau type de filet.
qui sera créée par \pkg{nicematrix} et que l'utilisateur pourra utiliser pour
tracer des filets horizontaux (de manière similaire à |\hline|) ;
-\item \colorbox{yellow!50}{\textbf{Nouveau 6.11}}\enskip la clé |ccommand|
-indique le nom (sans la contre-oblique) d'une commande qui sera créée par
-\pkg{nicematrix} et que l'utilisateur pourra utiliser pour tracer des filets
-horizontaux partiels (de manière similaire à |\cline|, d'où le nom |ccommand|) :
-l'argument de cette commande est une liste d'intervalles de colonnes spécifiés
-par la syntaxe $i$ ou $i$-$j$ ;\footnote{Il est recommandé de n'utiliser ces
- commandes qu'une seule fois par ligne car chaque utilisation crée un espace
- vertical entre les rangées correspondant à la largeur totale du trait qui sera
- tracé.}
+\item la clé |ccommand| indique le nom (sans la contre-oblique) d'une commande
+qui sera créée par \pkg{nicematrix} et que l'utilisateur pourra utiliser pour
+tracer des filets horizontaux partiels (de manière similaire à |\cline|, d'où le
+nom |ccommand|) : l'argument de cette commande est une liste d'intervalles de
+colonnes spécifiés par la syntaxe $i$ ou $i$-$j$ ;\footnote{Il est recommandé de
+ n'utiliser ces commandes qu'une seule fois par ligne car chaque utilisation
+ crée un espace vertical entre les rangées correspondant à la largeur totale du
+ trait qui sera tracé.}
\item la clé |letter| prend en argument une lettre\footnote{Les lettres
suivantes ne sont pas autorisées : \verb+lcrpmbVX|()[]!@<>+} qui pourra être
@@ -1268,20 +1426,20 @@ Produit C & 5 & 4 & 1 \\
\item \emph{Deuxième possibilité}\par\nobreak
-On peut utiliser la clé |tikz| (si Tikz est chargé, \pkg{nicematrix} ne
+On peut utiliser la clé |tikz| (si TikZ est chargé, \pkg{nicematrix} ne
chargeant par défaut que \textsc{pgf}). Dans ce cas-là, le filet est tracé
-directement avec Tikz en utilisant comme paramètres la valeur de la clé |tikz|
+directement avec TikZ en utilisant comme paramètres la valeur de la clé |tikz|
qui doit être une liste de couples \textsl{clé=valeur} applicables à un chemin
-Tikz.
+TikZ.
Par défaut aucune réservation de place n'est faite pour le filet qui sera tracé
-avec Tikz. On peut demander une réservation (horizontale pour un filet vertical
+avec TikZ. On peut demander une réservation (horizontale pour un filet vertical
et verticale pour un filet horizontal) avec la clé |total-width| qui est donc en
quelque sorte la largeur du filet qui sera tracé (cette largeur n'est \emph{pas}
calculée à partir des caractéristiques fournies par la clé |tikz|).
\bigskip
-Voici ce que l'on obtient avec la clé |dotted| de Tikz.
+Voici ce que l'on obtient avec la clé |dotted| de TikZ.
\begin{Verbatim}
\NiceMatrixOptions
@@ -1323,7 +1481,7 @@ sept & huit & neuf
\label{dotted}
Comme on le voit dans l'exemple précédent, les pointillés tracés par la clé
-|dotted| de Tikz ne sont pas ronds. C'est pourquoi l'extension \pkg{nicematrix}
+|dotted| de TikZ ne sont pas ronds. C'est pourquoi l'extension \pkg{nicematrix}
propose dans la clé |custom-line| une clé |dotted| qui va tracer des pointillés
ronds. La valeur initiale de la clé |total-width| est, dans ce cas-là, égale au
diamètre des points (l'utilisateur peut quand même utiliser la clé |total-width|
@@ -1476,7 +1634,7 @@ peut placer le contenu de ce |code-before| entre les mots-clés |\CodeBefore| et
De nouvelles commandes sont disponibles dans ce |\CodeBefore|: |\cellcolor|,
|\rectanglecolor|, |\rowcolor|, |\columncolor|, |\rowcolors|, |\rowlistcolors|,
|\chessboardcolors| et |\arraycolor|.\footnote{On pourra remarquer que, dans le
- |\CodeBefore|, des nœuds PGF-Tikz de la forme \verb+(i-|j)+ correspondant à la
+ |\CodeBefore|, des nœuds PGF-TikZ de la forme \verb+(i-|j)+ correspondant à la
position des filets éventuels sont également accessibles : cf.
p.~\pageref{nodes-i}.}
\label{code-before}
@@ -2091,7 +2249,7 @@ supprimé (il est évidemment possible de le supprimer en mettant |\tabcolsep| o
Il est possible de donner la valeur spéciale |auto| à l'option |columns-width|:
toutes les colonnes du tableau auront alors une largeur égale à la largeur de la
case la plus large du tableau.\footnote{Le résultat est atteint dès la première
- compilation (mais PGF-Tikz écrivant des informations dans le fichier |aux|,
+ compilation (mais PGF-TikZ écrivant des informations dans le fichier |aux|,
un message demandant une deuxième compilation apparaîtra).}\par\nobreak
\medskip
@@ -2252,7 +2410,7 @@ un très très très très long texte
Dans le cadre de
\pkg{nicematrix}, l'un des intérêts des colonnes de type |V| par rapport aux
colonnes de type |p|, |m| ou |b| est que, pour les cases d'une telle colonne,
-le nœud PGF-Tikz créé pour le contenu d'une telle case a une largeur ajustée
+le nœud PGF-TikZ créé pour le contenu d'une telle case a une largeur ajustée
au contenu de la cellule en question : cf. p.~\pageref{node-V}.
\medskip
@@ -2896,9 +3054,8 @@ clés simultanément. La valeur initiale de $0.3$~em (il est conseillé d'utilis
unité de mesure dépendante de la fonte courante).
\smallskip
-\colorbox{yellow!50}{\textbf{Nouveau 6.10}}\enskip Les clés
-|xdots/shorten-start| et |xdots/shorten-end| ont été introduites dans la
-version~6.10. Les versions précédentes ne proposaient que |xdots/shorten|.
+Les clés |xdots/shorten-start| et |xdots/shorten-end| ont été introduites dans
+la version~6.10. Les versions précédentes ne proposaient que |xdots/shorten|.
\medskip
\textbf{L'option xdots/inter}\par\nobreak
@@ -2912,7 +3069,7 @@ unité de mesure dépendante de la fonte courante).
\textbf{L'option xdots/line-style}\par\nobreak
\smallskip
-Il faut savoir que, par défaut, les lignes de Tikz tracées avec le paramètre
+Il faut savoir que, par défaut, les lignes de TikZ tracées avec le paramètre
|dotted| sont composées de points carrés et non pas ronds.\footnote{La raison de
départ est que le format \textsc{pdf} comporte un système de description de
lignes en tiretés, qui, puisqu'il est incorporé dans le \textsc{pdf}, est
@@ -2920,7 +3077,7 @@ Il faut savoir que, par défaut, les lignes de Tikz tracées avec le paramètre
partir de ce type de ligne de créer des lignes de points carrés alors qu'une
ligne de points ronds doit être construite explicitement point par point. Voir
néanmoins à l'adresse suivante pour un moyen d'avoir un style de pointillés
-ronds avec Tikz :\newline \small
+ronds avec TikZ :\newline \small
\url{https://tex.stackexchange.com/questions/52848/tikz-line-with-large-dots}}
@@ -2938,9 +3095,9 @@ appelé le style |standard|. Cette valeur est la valeur initiale du paramètre
|xdots/line-style|.
\medskip
-Néanmoins (quand Tikz est chargé), on peut utiliser pour |xdots/line-style|
-n'importe quel style proposé par Tikz, c'est-à-dire n'importe quelle suite
-d'options Tikz applicables à un chemin (à l'exception de «|color|»,
+Néanmoins (quand TikZ est chargé), on peut utiliser pour |xdots/line-style|
+n'importe quel style proposé par TikZ, c'est-à-dire n'importe quelle suite
+d'options TikZ applicables à un chemin (à l'exception de «|color|»,
«|shorten >|» et «|shorten <|»).
\medskip
@@ -3016,7 +3173,7 @@ quand même un argument optionnel (entre crochets).\footnote{Les clés autorisé
\medskip
Les utilisateurs expérimentés peuvent, en particulier, utiliser les nœuds
-PGF-Tikz créés par \pkg{nicematrix} dans le |\CodeAfter|. Ces nœuds sont décrits
+PGF-TikZ créés par \pkg{nicematrix} dans le |\CodeAfter|. Ces nœuds sont décrits
à partir de la page \pageref{PGF-nodes}.
\medskip
@@ -3034,8 +3191,8 @@ Chacun de ces deux arguments peut être :
\begin{itemize}
\item une spécification de case de la forme $i$-$j$ où $i$ est le numéro de
ligne et $j$ est le numéro de colonne ;
-\item \colorbox{yellow!50}{\textbf{Nouveau 6.10}}\enskip le nom d'un bloc (créé
-avec la commande |\Block| en utilisant la clé |name| de cette commande).
+\item le nom d'un bloc (créé avec la commande |\Block| en utilisant la clé
+|name| de cette commande).
\end{itemize}
Les options disponibles pour personnaliser les lignes pointillées créées par
|\Cdots|, |\Vdots|, etc. peuvent aussi être passées à cette commande (cf.
@@ -3267,7 +3424,7 @@ c & d & \frac12c+\frac14d \\
\medskip
Il existe aussi une clé |name| qui permet de donner un nom à une sous-matrice
créée par une commande |\SubMatrix|. Ce nom est utilisé pour créer des nœuds
-PGF-Tikz : voir p.~\pageref{node-sub-matrix}.
+PGF-TikZ : voir p.~\pageref{node-sub-matrix}.
\medskip
Il est également possible de spécifier des délimiteurs\footnote{Les délimiteurs
@@ -3385,9 +3542,8 @@ $\begin{pNiceMatrix}
\subsection{La légendes des tableaux}
-\colorbox{yellow!50}{\bfseries Nouveau 6.12}\enskip L'environnement
-|{NiceTabular}| propose des clés |caption|, |short-caption| et |label| à
-utiliser lorsque le tableau est inséré dans un environnment flottant
+L'environnement |{NiceTabular}| propose des clés |caption|, |short-caption| et
+|label| à utiliser lorsque le tableau est inséré dans un environnment flottant
(typiquement un environnement |{table}|).
\smallskip
@@ -3514,9 +3670,9 @@ tableau en un seul paragraphe.
\item Il existe une clé |tabularnote| qui permet d'insérer du texte dans la zone
des notes avant les notes numérotées.
-\colorbox{yellow!50}{\textbf{Nouveau 6.13} }\enskip Une syntaxe alternative est
-proposée : il est possible d'utiliser l'environnement |{TabularNote}| à la fin de
-l'environnement |{NiceTabular}| (mais \emph{avant} l'éventuel |\CodeAfter|).
+Une syntaxe alternative est proposée : il est possible d'utiliser
+l'environnement |{TabularNote}| à la fin de l'environnement |{NiceTabular}|
+(mais \emph{avant} l'éventuel |\CodeAfter|).
\item Si l'extension \pkg{booktabs} a été chargée (avant ou après
\pkg{nicematrix}), la clé |notes/bottomrule| permet de faire tracer un
@@ -3834,10 +3990,9 @@ charge par \pkg{nicematrix}.
\label{columns-type}
-\colorbox{yellow!50}{\textbf{Nouveau 6.11}}\enskip Les environnements sans
-préambule (|{NiceMatrix}|, |{pNiceMatrix}|, etc.) ainsi que la commande
-|\pAutoNiceMatrix| et ses variantes, acceptent la clé |columns-type| qui indique
-le type des colonne qui sera utilisé.
+Les environnements sans préambule (|{NiceMatrix}|, |{pNiceMatrix}|, etc.) ainsi
+que la commande |\pAutoNiceMatrix| et ses variantes, acceptent la clé
+|columns-type| qui indique le type des colonne qui sera utilisé.
\medskip
Les clés |l| et |r| sont des raccourcis pour |columns-type=l| et |columns-type=r|.
@@ -4143,14 +4298,14 @@ elle est sans effet.
Pour un exemple d'utilisation, voir \url{tex.stackexchange.com/questions/488566}
-\section{Utilisation de Tikz avec nicematrix}
+\section{Utilisation de TikZ avec nicematrix}
\label{name}\label{PGF-nodes}
\subsection{Les nœuds correspondant aux contenus des cases}
-L'extension \pkg{nicematrix} crée un nœud PGF-Tikz pour chaque case non vide
+L'extension \pkg{nicematrix} crée un nœud PGF-TikZ pour chaque case non vide
du tableau considéré. Ces nœuds sont utilisés, entre autres, pour tracer les
lignes en pointillés entre les cases du tableau.
@@ -4184,9 +4339,9 @@ de donner un nom à l'environnement. Une fois l'environnement nommé, les nœuds
sont accessibles à travers les noms «\textsl{nom}-$i$-$j$» où \textsl{nom} est
le nom donné au tableau et $i$ et $j$ les numéros de rangée et de colonne de la
case considérée. On peut les utiliser avec \textsc{pgf} mais l'utilisateur final
-préférera sans doute utiliser Tikz (qui est une sur-couche de \textsc{pgf}). Il
-faut néanmoins se souvenir que \pkg{nicematrix} ne charge pas Tikz par défaut.
-Dans les exemples qui suivent, on suppose que Tikz a été chargé par
+préférera sans doute utiliser TikZ (qui est une sur-couche de \textsc{pgf}). Il
+faut néanmoins se souvenir que \pkg{nicematrix} ne charge pas TikZ par défaut.
+Dans les exemples qui suivent, on suppose que TikZ a été chargé par
l'utilisateur.
\medskip
@@ -4212,7 +4367,7 @@ Ne pas oublier les options |remember picture| et |overlay|.
\medskip
-Dans le |\CodeAfter|, et si Tikz est chargé, les choses sont plus simples. On
+Dans le |\CodeAfter|, et si TikZ est chargé, les choses sont plus simples. On
peut (et on doit) désigner les nœuds sous la forme $i$-$j$ : il n'y a pas à
préciser l'environnement qui est évidemment l'environnement courant.
@@ -4273,7 +4428,7 @@ de la dernière ligne peuvent être désignés par |last|-$j$.
Quand l'extension \pkg{varwidth} est chargée, les colonnes de type |V| définies
par \pkg{varwidth} sont prises en charge par \pkg{nicematrix}. Il peut être
intéressant de préciser que, pour une cellule située dans une colonne de type
-|V|, le nœud PGF-Tikz créé par \pkg{nicematrix} pour le contenu de cette cellule
+|V|, le nœud PGF-TikZ créé par \pkg{nicematrix} pour le contenu de cette cellule
a une largeur ajustée au contenu de cette cellule. Cela est en contraste avec le
cas des colonnes de type |p|, |m| ou |b| dans lesquelles les nœuds ont toujours
une largeur égale à la largeur de la colonne. Dans l'exemple suivant, la
@@ -4569,7 +4724,7 @@ Voici un exemple d'utilisation de ces nœuds dans le |\CodeAfter|.
\label{nodes-i}
-L'extension \pkg{nicematrix} crée un nœud PGF-Tikz nommé simplement $i$ (précédé
+L'extension \pkg{nicematrix} crée un nœud PGF-TikZ nommé simplement $i$ (précédé
du préfixe habituel) à l'intersection du filet horizontal de numéro $i$ et du
filet vertical de numéro~$i$ (ou plutôt la position potentielle de ces filets
car ils ne sont peut-être pas tracés). Le dernier nœud a aussi un alias nommé
@@ -4598,8 +4753,8 @@ muguet & dahlia
\medskip
-Si on utilise Tikz (on rappelle que \pkg{nicematrix} ne charge pas Tikz mais
-uniquement \textsc{pgf} qui est une sous-couche de Tikz), on peut donc accéder
+Si on utilise TikZ (on rappelle que \pkg{nicematrix} ne charge pas TikZ mais
+uniquement \textsc{pgf} qui est une sous-couche de TikZ), on peut donc accéder
(dans le |\CodeAfter| mais aussi dans le |\CodeBefore|) à l'intersection du filet
horizontal~$i$ et du filet vertical~$j$ avec la syntaxe |(|$i$\verb+-|+$j$|)|.
@@ -4639,7 +4794,7 @@ horizontal~$i$ et du filet vertical~$j$ avec la syntaxe |(|$i$\verb+-|+$j$|)|.
\medskip
Les nœuds de la forme $i$|.5| peuvent être utilisés par exemple pour barrer une
-ligne (si on a chargé Tikz).
+ligne (si on a chargé TikZ).
\smallskip
\begin{BVerbatim}[boxwidth=11cm,baseline=c]
@@ -4669,7 +4824,7 @@ p.~\pageref{sub-matrix}.
\smallskip
Si une commande |\SubMatrix| est utilisée avec la clé |name| sous la forme
-|name=|\textsl{\ttfamily MonNom}, trois nœuds PGF-Tikz sont créés avec les noms
+|name=|\textsl{\ttfamily MonNom}, trois nœuds PGF-TikZ sont créés avec les noms
\textsl{\ttfamily MonNom}|-left|, \textsl{\ttfamily MonNom} et \textsl{\ttfamily
MonNom}|-right|.
@@ -4729,7 +4884,7 @@ compilation supplémentaire (car les instructions sont écrites dans le fichier
\medskip
\emph{Exemple} : On souhaite écrire une commande |\crossbox| qui barre en croix
la cellule courante. Cette commande prendra en argument optionnel une liste de
-couples \textsl{clé}-\textsl{valeur} qui sera passée à Tikz avant que la croix
+couples \textsl{clé}-\textsl{valeur} qui sera passée à TikZ avant que la croix
ne soit tracée.
@@ -4753,8 +4908,8 @@ utilise explicitement la variable publique |\g_nicematrix_code_before_tl|.
\tl_gput_right:Nx §emphase¤\g_nicematrix_code_before_tlμ
{
\__pantigny_crossbox:nnn
- { \int_use:c { c@iRow } }
- { \int_use:c { c@jCol } }
+ { \arabic { iRow } }
+ { \arabic { jCol } }
{ \exp_not:n { #1 } }
}
}
@@ -4777,8 +4932,8 @@ utilise explicitement la variable publique |\g_nicematrix_code_before_tl|.
\tl_gput_right:Nx \g_nicematrix_code_before_tl
{
\__pantigny_crossbox:nnn
- { \int_use:c { c@iRow } }
- { \int_use:c { c@jCol } }
+ { \arabic { iRow } }
+ { \arabic { jCol } }
{ \exp_not:n { #1 } }
}
}
@@ -4929,7 +5084,7 @@ vide si (et seulement si) son rendu TeX est de largeur nulle.
\medskip
\item Une case qui contient la commande |\NotEmpty| est non vide (et un nœud
-PGF-Tikz est créé pour cette case).
+PGF-TikZ est créé pour cette case).
\medskip
\item Une case avec seulement une commande |\Hspace| (ou |\Hspace*|) est vide.
@@ -4973,7 +5128,7 @@ environnements de l'extension \pkg{nicematrix} ne sont pas affectés).
\medskip
L'extension \pkg{nicematrix} n'est pas compatible avec la classe \cls{ieeeaccess}
-(car cette classe n'est pas compatible avec PGF-Tikz).\footnote{Voir
+(car cette classe n'est pas compatible avec PGF-TikZ).\footnote{Voir
\url{https://tex.stackexchange.com/questions/528975/error-loading-tikz-in-ieeeaccess-class}}
\medskip
@@ -5015,11 +5170,11 @@ cf.~p.~\pageref{custom-line}.
\label{tikz-key-examples}
-La clé |tikz| de la commande |\Block| n'est disponible que lorsque Tikz est
+La clé |tikz| de la commande |\Block| n'est disponible que lorsque TikZ est
chargé.\footnote{Par défaut, \pkg{nicematrix} ne charge que \textsc{pgf}, qui
- est une sous-couche de Tikz.}
+ est une sous-couche de TikZ.}
-Pour l'exemple suivant, la bibliothèque \pkg{patterns} de Tikz doit aussi être chargée.
+Pour l'exemple suivant, la bibliothèque \pkg{patterns} de TikZ doit aussi être chargée.
\begin{Verbatim}
\usetikzlibrary{patterns}
@@ -5275,7 +5430,7 @@ pointillées.
\interitem
On peut même tracer des lignes continues.\footnote{Dans ce document, la
- bibliothèque \pkg{arrows.meta} de Tikz a été chargée, ce qui a une incidence
+ bibliothèque \pkg{arrows.meta} de TikZ a été chargée, ce qui a une incidence
sur la forme des pointes de flèches.}
\begin{Verbatim}
@@ -5311,7 +5466,7 @@ $\begin{pNiceMatrix}[first-row,first-col]
\label{tiretes}
Dans l'exemple suivant, on utilise des commandes |\Block| pour tracer des filets
-en tiretés. Cet exemple nécessite que Tikz soit chargé (par
+en tiretés. Cet exemple nécessite que TikZ soit chargé (par
|\usepackage{tikz}|).
\begin{Verbatim}
@@ -5705,9 +5860,9 @@ pourquoi nous présentons ici une autre méthode pour surligner une rangée d'un
matrice.
\medskip
-Cet exemple et les suivants nécessitent d'avoir chargé Tikz (\pkg{nicematrix} ne
-charge que \textsc{pgf}, qui est une sous-couche de Tikz) ainsi que la
-bibliothèque Tikz |fit|, ce qui peut se faire avec les deux instructions
+Cet exemple et les suivants nécessitent d'avoir chargé TikZ (\pkg{nicematrix} ne
+charge que \textsc{pgf}, qui est une sous-couche de TikZ) ainsi que la
+bibliothèque TikZ |fit|, ce qui peut se faire avec les deux instructions
suivantes dans le préambule du document :
\begin{verbatim}
@@ -5716,8 +5871,8 @@ suivantes dans le préambule du document :
\end{verbatim}
\medskip
-Nous créons un nœud Tikz rectangulaire qui englobe les nœuds de la deuxième
-rangée en utilisant les outils de la bibliothèque Tikz \pkg{fit}. Ces nœuds ne
+Nous créons un nœud TikZ rectangulaire qui englobe les nœuds de la deuxième
+rangée en utilisant les outils de la bibliothèque TikZ \pkg{fit}. Ces nœuds ne
sont pas créés par défaut dans le |\CodeBefore| (par souci d'efficacité). Il
faut utiliser la clé |create-cell-nodes| du |\CodeBefore| pour demander leur création.
@@ -5924,6 +6079,8 @@ TeXLive sont disponibles sur le serveur \textsc{svn} de TeXLive :
\nolinkurl{www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
}
+\tableofcontents
+
\end{document}
% Local Variables:
diff --git a/macros/latex/contrib/nicematrix/nicematrix.dtx b/macros/latex/contrib/nicematrix/nicematrix.dtx
index 02d0f8e8b8..dceae17ad9 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.dtx
+++ b/macros/latex/contrib/nicematrix/nicematrix.dtx
@@ -17,8 +17,8 @@
%
% \fi
% \iffalse
-\def\myfileversion{6.13f}
-\def\myfiledate{2023/02/05}
+\def\myfileversion{6.14}
+\def\myfiledate{2023/02/18}
%
%
%<*batchfile>
@@ -533,28 +533,6 @@ version 2005/12/01 or later.
% \end{bNiceArray}$
% \end{scope}
%
-% \medskip
-% It's possible to set the horizontal position of the block with one of the keys
-% |l|, |c| and |r|.
-%
-%
-% \medskip
-% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
-% \end{BVerbatim}
-% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
-% \Block[r]{3-3}<\LARGE>{A} & & & 0 \\
-% & & & \Vdots \\
-% & & & 0 \\
-% \hline
-% 0 & \Cdots& 0 & 0
-% \end{bNiceArray}$
%
% \interitem
% In fact, the command |\Block| accepts as first optional argument (between
@@ -581,8 +559,6 @@ version 2005/12/01 or later.
% by |draw| and the shape drawn by |fill|) with a radius equal to the value of
% that key (the default value is 4~pt\footnote{This value is the initial value
% of the \emph{rounded corners} of Tikz.});
-% \item the keys |t| and |b| fix the base line that will be given to the block
-% when it has a multi-line content (the lines are separated by |\\|);
% \item when the key |tikz| is used, the Tikz path corresponding of the
% rectangle which delimits the block is executed with Tikz\footnote{Tikz should
% be loaded (by default, \pkg{nicematrix} only loads \textsc{pgf}) and, if it's
@@ -602,6 +578,9 @@ version 2005/12/01 or later.
% \textsl{key=value} of Tikz specifying the graphical characteristics of the
% lines that will be drawn (for an example, see p.~\pageref{dashed}).
% \end{itemize}
+%
+% There is also keys for the horizontal and vertical positions of the content of
+% the block: cf.~\ref{horizontal-block} p.~\pageref{horizontal-block}).
%
% \interitem
% {\bfseries One must remark that, by default, the commands |\Blocks| don't create space}.
@@ -649,7 +628,9 @@ version 2005/12/01 or later.
% that width.
%
% \item The specification of the horizontal position provided by the type of
-% column (|c|, |r| or |l|) is taken into account for the blocks.
+% column (|c|, |r| or |l|) is taken into account for the blocks (but the
+% |\Block| may have its own specification of alignment:
+% cf.~\ref{horizontal-block} p.~\pageref{horizontal-block}).
%
% \item The specifications of font specified for the column by a construction
% |>{...}| in the preamble of the array are taken into account for the
@@ -749,6 +730,31 @@ version 2005/12/01 or later.
%
% \subsection{Horizontal position of the content of the block}
%
+% \label{horizontal-block}
+%
+% The command |\Block| accepts the keys |l|, |c| and |r| for the horizontal
+% position of its content.
+%
+% \medskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10.6cm]
+% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+% \Block~emphase#[r]@{3-3}<\LARGE>{A} & & & 0 \\
+% & & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+% \end{BVerbatim}
+% $\begin{bNiceArray}{cw{c}{1cm}c|c}[margin]
+% \Block[r]{3-3}<\LARGE>{A} & & & 0 \\
+% & & & \Vdots \\
+% & & & 0 \\
+% \hline
+% 0 & \Cdots& 0 & 0
+% \end{bNiceArray}$
+%
+%
+%
% By default, the horizontal position of the content of a block is computed
% by using the positions of the \emph{contents} of the columns implied in that
% block. That's why, in the following example, the header ``First group'' is
@@ -795,7 +801,167 @@ version 2005/12/01 or later.
% contents of those columns), one may use the key |L|, |R| and |C| of the
% command |\Block|.
%
+% \medskip
+% Here is the same example with the key |C| for the first block.
+%
+% \medskip
+% \begin{center}
+% \fvset{commandchars=\~\#\+}
+% \begin{BVerbatim}
+% \begin{NiceTabular}{@{}c!{\qquad}ccc~emphase#!{\qquad}+ccc@{}}
+% \toprule
+% Rank & ~emphase#\Block[C]{1-3}{First group}+ & & & \Block{1-3}{Second group} \\
+% & 1A & 1B & 1C & 2A & 2B & 2C \\
+% \midrule
+% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+% \bottomrule
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \end{center}
%
+% \bigskip
+% \begin{center}
+% \begin{NiceTabular}{@{}c!{\qquad}ccc!{\qquad}ccc@{}}
+% \toprule
+% Rank & \Block[C]{1-3}{First group} & & & \Block{1-3}{Second group} \\
+% & 1A & 1B & 1C & 2A & 2B & 2C \\
+% \midrule
+% 1 & 0.657 & 0.913 & 0.733 & 0.830 & 0.387 & 0.893\\
+% 2 & 0.343 & 0.537 & 0.655 & 0.690 & 0.471 & 0.333\\
+% 3 & 0.783 & 0.885 & 0.015 & 0.306 & 0.643 & 0.263\\
+% 4 & 0.161 & 0.708 & 0.386 & 0.257 & 0.074 & 0.336\\
+% \bottomrule
+% \end{NiceTabular}
+% \end{center}
+%
+%
+% \subsection{Vertical position of the content of the block}
+%
+% \colorbox{yellow!50}{\textbf{New 6.14}}
+%
+% For the vertical position, the commands |\Blocks| accepts the keys
+% |v-center|\footnote{That key could not have been named |c| since the key |c|
+% is used for the horizontal alignement.},
+% |t|, |b|, |T| and |B|.
+%
+% \begin{itemize}
+% \item With the key |v-center|, the content of the block is vertically
+% centered.
+% \item With the key |t|, the baseline of the content of the block is aligned
+% With the basline of the first row concerned by the block).
+% \item with the key |b|, the baseline of the last row of the content of the
+% block (we recall that the content of a block may contains several lines
+% separated by |\\|) is aligned with the baseline of the last of the rows of the
+% array involved in the block.
+% \item With the key |T|, the content of the block is set upwards with only a
+% margin equal to the PGF/Tikz parameter |inner ysep|.
+% \item With the key |B|, the content of the block is set downwards with only a
+% margin equal to the PGF/Tikz parameter |inner ysep|.
+% \end{itemize}
+%
+% When no key is given, the key |v-center| applies (excepted in the mono-row blocks).
+%
+%
+%
+% \medskip
+% \begin{scope}
+% \NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
+%
+% \begin{BVerbatim}
+% \NiceMatrixOptions{rules/color=[gray]{0.75}, hvlines}
+% \end{BVerbatim}
+%
+% \bigskip
+%
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,~emphase#t@,l]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,t,l]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+%
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,~emphase#b@,r]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,b,r]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,~emphase#T@,l]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,T,l]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+%
+%
+% \bigskip
+% \begin{BVerbatim}[baseline=c,boxwidth=10cm]
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,~emphase#B@,r]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+% \end{BVerbatim}
+% \begin{NiceTabular}{ccc}
+% \Block[fill=red!10,B,r]{4-2}{two\\lines}
+% & & \Huge first\\
+% & & second \\
+% & & third \\
+% & & fourth \\
+% text & text \\
+% \end{NiceTabular}
+%
+% \end{scope}
+%
+%
+%
+%
% \section{The rules}
%
% \label{rules}
@@ -1000,10 +1166,9 @@ version 2005/12/01 or later.
% In particular, this remark explains the difference between the standard
% command |\hline| and the command |\Hline| provided by \pkg{nicematrix}.
%
-% \colorbox{yellow!50}{\textbf{New 6.13}}\enskip The key |\Hline| takes in an
-% optional argument (between square brackets) which is a list of
-% \textsl{key=value} pairs. For the description of those keys, see |custom-line|
-% on p.~\pageref{custom-line}.
+% The key |\Hline| takes in an optional argument (between square brackets) which
+% is a list of \textsl{key=value} pairs. For the description of those keys, see
+% |custom-line| on p.~\pageref{custom-line}.
%
% \subsubsection{The keys hlines and vlines}
%
@@ -1211,14 +1376,13 @@ version 2005/12/01 or later.
% will be created by \pkg{nicematrix} and that will be available for the final
% user in order to draw horizontal rules (similarly to |\hline|);
%
-% \item \colorbox{yellow!50}{\textbf{New 6.11}}\enskip the key |cccommand| is
-% the name (without the backslash) of a command that will be created by
-% \pkg{nicematrix} and that will be available for the final user to order to
-% draw partial horizontal rules (similarly to |\cline|, hence the name
-% |ccommand|): the argument of that command is a list of intervals of columns
-% specified by the syntax~$i$ or $i$-$j$.\footnote{It's recommended to use such
-% commands only once in a row because each use will create space between the
-% rows corresponding to the total width of the rule.}
+% \item the key |cccommand| is the name (without the backslash) of a command
+% that will be created by \pkg{nicematrix} and that will be available for the
+% final user to order to draw partial horizontal rules (similarly to |\cline|,
+% hence the name |ccommand|): the argument of that command is a list of
+% intervals of columns specified by the syntax~$i$ or $i$-$j$.\footnote{It's
+% recommended to use such commands only once in a row because each use will
+% create space between the rows corresponding to the total width of the rule.}
%
% \item the key |letter| takes in as argument a letter\footnote{The following
% letters are forbidden: \verb+lcrpmbVX|()[]!@<>+} that the user will use in
@@ -1653,7 +1817,7 @@ version 2005/12/01 or later.
% \item The command |\rowcolors| (with a \emph{s}) takes its name from the
% command |\rowcolors| of \pkg{colortbl}. The \emph{s} emphasizes
% the fact that there is \emph{two} colors. This command colors alternately the
-% rows of the tabular with the tow colors (provided in second and third
+% rows of the tabular with the two colors (provided in second and third
% argument), beginning with the row whose number is given in first (mandatory)
% argument.
%
@@ -2862,11 +3026,6 @@ version 2005/12/01 or later.
% The initial value is 0.3~em (it is recommanded to use a unit of length
% dependent of the current font).
%
-% \smallskip
-% \colorbox{yellow!50}{\textbf{New 6.10}}\enskip The keys |xdots/shorten-start|
-% and |xdots/shorten-end| have been introduced in version 6.10. In the previous
-% versions, there was only |xdots/shorten|.
-%
% \bigskip
% \textbf{The option xdots/inter}\par\nobreak
%
@@ -2999,8 +3158,8 @@ version 2005/12/01 or later.
% \begin{itemize}
% \item a specification of cell of the form $i$-$j$ where is the
% number of the row and $j$ is the number of the column;
-% \item \colorbox{yellow!50}{\textbf{New 6.10}}\enskip the name of a block
-% (created by the command |\Block| with the key |name| of that command).
+% \item the name of a block (created by the command |\Block| with the key |name|
+% of that command).
% \end{itemize}
% The options available for the customisation of the dotted lines created by
% |\Cdots|, |\Vdots|, etc. are also available for this command (cf.
@@ -3351,10 +3510,9 @@ version 2005/12/01 or later.
% \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}|).
+% 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
@@ -3469,10 +3627,9 @@ version 2005/12/01 or later.
% \item There is a key |tabularnote| which provides a way to insert some text in
% the zone of the notes before the numbered tabular notes.
%
-% \colorbox{yellow!50}{\textbf{New 6.13}}\enskip An alternative syntaxe is
-% available with the environment |{TabularNote}|. That environment should be
-% used at the end of the environment |{NiceTabular}| (but \emph{before} a
-% potential instruction |\CodeAfter|).
+% An alternative syntaxe is available with the environment |{TabularNote}|. That
+% environment should be used at the end of the environment |{NiceTabular}| (but
+% \emph{before} a potential instruction |\CodeAfter|).
%
% \item If the package \pkg{booktabs} has been loaded (before or after
% \pkg{nicematrix}), the key |notes/bottomrule| draws a |\bottomrule| of
@@ -3790,11 +3947,10 @@ version 2005/12/01 or later.
%
% \label{columns-width}
%
-% \colorbox{yellow!50}{\textbf{New 6.11}}\enskip The environments without
-% preamble (|{NiceMatrix}|, |{pNiceMatrix}|, |{bNiceMatrix}|, etc.) and the
-% commande |\pAutoNiceMatrix| (and its variants) provide an option
-% |columns-type| to specify the type of column which will be used (the initial
-% value is, of course, |c|).
+% The environments without preamble (|{NiceMatrix}|, |{pNiceMatrix}|,
+% |{bNiceMatrix}|, etc.) and the commande |\pAutoNiceMatrix| (and its variants)
+% provide an option |columns-type| to specify the type of column which will be
+% used (the initial value is, of course, |c|).
%
% The keys |l| and |r| are shortcuts for |columns-type=l| and |columns-type=r|.
%
@@ -7084,8 +7240,8 @@ version 2005/12/01 or later.
% For the vertical position, the possible values are |c|, |t| and |b|. Of
% course, it would be interesting to program a key |T| and a key |B|.
% \begin{macrocode}
-\tl_new:N \l_@@_vpos_of_block_tl
-\tl_set:Nn \l_@@_vpos_of_block_tl { c }
+\str_new:N \l_@@_vpos_of_block_str
+\str_set:Nn \l_@@_vpos_of_block_str { c }
% \end{macrocode}
%
%
@@ -11138,7 +11294,7 @@ version 2005/12/01 or later.
% After a specifier of column, we have to test whether there is one or several
% |<{..}| because, after those potential |<{...}|, we have to insert
% |!{\skip_horizontal:N ...}| when the key |vlines| is used. In fact, we have
-% also to test wheter there is, after the |<{...}|, a |@{...}|.
+% also to test whether there is, after the |<{...}|, a |@{...}|.
% \begin{macrocode}
\cs_new_protected:Npn \@@_patch_preamble_xi:n #1
{
@@ -11162,7 +11318,7 @@ version 2005/12/01 or later.
}
}
\@@_patch_preamble:n { #1 }
- }
+ }
}
}
% \end{macrocode}
@@ -11188,15 +11344,16 @@ version 2005/12/01 or later.
}
{
\exp_args:NNx
- \clist_if_in:NnT \l_@@_vlines_clist { \int_eval:n { \c@jCol + 1 } }
+ \clist_if_in:NnTF \l_@@_vlines_clist { \int_eval:n { \c@jCol + 1 } }
{
\tl_gput_right:Nn \g_@@_preamble_tl
{ @ { #1 \skip_horizontal:N \arrayrulewidth } }
}
+ { \tl_gput_right:Nn \g_@@_preamble_tl { @ { #1 } } }
}
\@@_patch_preamble:n
}
-% \end{macrocode}
+% \end{macrocode}
%
% \bigskip
% \begin{macrocode}
@@ -11212,7 +11369,6 @@ version 2005/12/01 or later.
\exp_after:wN \@@_patch_m_preamble:n \the \@temptokena \q_stop
\group_end:
\tl_set_eq:NN #1 \g_@@_preamble_tl
- % \group_end:
}
% \end{macrocode}
%
@@ -17342,9 +17498,9 @@ version 2005/12/01 or later.
R .value_forbidden:n = true ,
C .code:n = \str_set:Nn \l_@@_hpos_block_str c ,
C .value_forbidden:n = true ,
- t .code:n = \str_set:Nn \l_@@_vpos_of_block_tl t ,
+ t .code:n = \str_set:Nn \l_@@_vpos_of_block_str t ,
t .value_forbidden:n = true ,
- b .code:n = \str_set:Nn \l_@@_vpos_of_block_tl b ,
+ b .code:n = \str_set:Nn \l_@@_vpos_of_block_str b ,
b .value_forbidden:n = true ,
color .tl_set:N = \l_@@_color_tl ,
color .value_required:n = true ,
@@ -17560,27 +17716,32 @@ version 2005/12/01 or later.
{
{ \int_compare_p:nNn { #2 } = 1 }
{ \dim_compare_p:n { \l_@@_col_width_dim >= \c_zero_dim } }
- { ! \g_@@_rotate_bool } % added 2022/09/16
+ { ! \g_@@_rotate_bool }
}
% \end{macrocode}
% When the block is mono-column in a column with a fixed width (eg |p{3cm}|).
% \begin{macrocode}
- {
- \begin { minipage } [ \l_@@_vpos_of_block_tl ]
- { \l_@@_col_width_dim }
- \str_case:Vn \l_@@_hpos_block_str
- {
- c \centering
- r \raggedleft
- l \raggedright
- }
+ {
+ \use:x
+ {
+ \exp_not:N \begin { minipage }%
+ [ \str_lowercase:V { \l_@@_vpos_of_block_str } ]
+ { \l_@@_col_width_dim }
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c \centering
+ r \raggedleft
+ l \raggedright
+ }
+ }
#5
\end { minipage }
}
{
\use:x
{
- \exp_not:N \begin { tabular } [ \l_@@_vpos_of_block_tl ]
+ \exp_not:N \begin { tabular }%
+ [ \str_lowercase:V { \l_@@_vpos_of_block_str } ]
{ @ { } \l_@@_hpos_block_str @ { } }
}
#5
@@ -17591,8 +17752,9 @@ version 2005/12/01 or later.
\c_math_toggle_token
\use:x
{
- \exp_not:N \begin { array } [ \l_@@_vpos_of_block_tl ]
- { @ { } \l_@@_hpos_block_str @ { } }
+ \exp_not:N \begin { array }%
+ [ \str_lowercase:V { \l_@@_vpos_of_block_str } ]
+ { @ { } \l_@@_hpos_block_str @ { } }
}
#5
\end { array }
@@ -17701,7 +17863,7 @@ version 2005/12/01 or later.
{ \str_set:Nn \l_@@_hpos_block_str c }
\use:x
{
- \exp_not:N \begin { tabular } [ \l_@@_vpos_of_block_tl ]
+ \exp_not:N \begin { tabular } [ \l_@@_vpos_of_block_str ]
{ @ { } \l_@@_hpos_block_str @ { } }
}
#5
@@ -17722,7 +17884,7 @@ version 2005/12/01 or later.
\c_math_toggle_token
\use:x
{
- \exp_not:N \begin { array } [ \l_@@_vpos_of_block_tl ]
+ \exp_not:N \begin { array } [ \l_@@_vpos_of_block_str ]
{ @ { } \l_@@_hpos_block_str @ { } }
}
#5
@@ -17795,18 +17957,21 @@ version 2005/12/01 or later.
C .code:n = \str_set:Nn \l_@@_hpos_block_str c
\bool_set_true:N \l_@@_hpos_of_block_cap_bool ,
C .value_forbidden:n = true ,
- t .code:n = \str_set:Nn \l_@@_vpos_of_block_tl t ,
+ t .code:n = \str_set:Nn \l_@@_vpos_of_block_str t ,
t .value_forbidden:n = true ,
- b .code:n = \str_set:Nn \l_@@_vpos_of_block_tl b ,
+ T .code:n = \str_set:Nn \l_@@_vpos_of_block_str T ,
+ T .value_forbidden:n = true ,
+ b .code:n = \str_set:Nn \l_@@_vpos_of_block_str b ,
b .value_forbidden:n = true ,
+ B .code:n = \str_set:Nn \l_@@_vpos_of_block_str B ,
+ B .value_forbidden:n = true ,
+ v-center .code:n = \str_set:Nn \l_@@_vpos_of_block_str { c } ,
+ v-center .value_forbidden:n = true ,
name .tl_set:N = \l_@@_block_name_str ,
name .value_required:n = true ,
name .initial:n = ,
respect-arraystretch .bool_set:N = \l_@@_respect_arraystretch_bool ,
respect-arraystretch .default:n = true ,
- v-center .bool_set:N = \l_@@_v_center_bool ,
- v-center .default:n = true ,
- v-center .initial:n = false ,
transparent .bool_set:N = \l_@@_transparent_bool ,
transparent .default:n = true ,
transparent .initial:n = false ,
@@ -17871,6 +18036,14 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
+%
+% \medskip
+% |#1| is the first row of the block;
+% |#2| is the first column of the block;
+% |#3| is the last row of the block;
+% |#4| is the last column of the block;
+% |#5| is a list of \textsl{key=value} options;
+% |#6| is the label
% \begin{macrocode}
\cs_new_protected:Npn \@@_Block_v:nnnnnn #1 #2 #3 #4 #5 #6
{
@@ -17878,21 +18051,10 @@ version 2005/12/01 or later.
% The group is for the keys.
% \begin{macrocode}
\group_begin:
+ \int_compare:nNnT { #1 } = { #3 }
+ { \str_set:Nn \l_@@_vpos_of_block_str { t } }
\keys_set:nn { NiceMatrix / Block / SecondPass } { #5 }
% \end{macrocode}
-%
-%
-% We restrict the use of the key |v-center| to the case of a mono-row block.
-% \begin{macrocode}
- \bool_if:NT \l_@@_v_center_bool
- {
- \int_compare:nNnF { #1 } = { #3 }
- {
- \@@_error:n { Wrong~use~of~v-center }
- \bool_set_false:N \l_@@_v_center_bool
- }
- }
-% \end{macrocode}
%
% \begin{macrocode}
\bool_if:NT \l_@@_vlines_block_bool
@@ -18192,30 +18354,111 @@ version 2005/12/01 or later.
}
}
% \end{macrocode}
+%
+% We take into account the case of a block of one row in the ``first row'' or
+% the ``last row''.
+% \begin{macrocode}
+ \int_compare:nNnT { #1 } = 0
+ {
+ \int_compare:nNnT { #3 } = 0
+ { \l_@@_code_for_first_row_tl }
+ }
+ \int_compare:nNnT { #1 } = \l_@@_last_row_int
+ {
+ \int_compare:nNnT { #3 } = \l_@@_last_row_int
+ { \l_@@_code_for_last_row_tl }
+ }
+% \end{macrocode}
+%
% \medskip
-% Now, we will put the label of the block beginning with the case of a |\Block|
-% of one row.
+% Now, we will put the label of the block.
% \begin{macrocode}
- \bool_if:nTF
- { \int_compare_p:nNn { #1 } = { #3 } && ! \l_@@_v_center_bool }
+ \bool_lazy_any:nTF
{
+ { \str_if_eq_p:Vn \l_@@_vpos_of_block_str { c } }
+ { \str_if_eq_p:Vn \l_@@_vpos_of_block_str { T } }
+ { \str_if_eq_p:Vn \l_@@_vpos_of_block_str { B } }
+ }
+% \medskip
+% \begin{macrocode}
+ {
% \end{macrocode}
-% We take into account the case of a block of one row in the ``first row'' or
-% the ``last row''.
+% If we are in the first column, we must put the block as if it was with the key~|r|.
% \begin{macrocode}
- \int_compare:nNnTF { #1 } = 0
- { \l_@@_code_for_first_row_tl }
- {
- \int_compare:nNnT { #1 } = \l_@@_last_row_int
- \l_@@_code_for_last_row_tl
+ \int_compare:nNnT { #2 } = 0
+ { \str_set:Nn \l_@@_hpos_block_str r }
+ \bool_if:nT \g_@@_last_col_found_bool
+ {
+ \int_compare:nNnT { #2 } = \g_@@_col_total_int
+ { \str_set:Nn \l_@@_hpos_block_str l }
+ }
+% \end{macrocode}
+% \begin{macrocode}
+ \tl_set:Nx \l_tmpa_tl
+ {
+ \str_case:Vn \l_@@_vpos_of_block_str
+ {
+ c {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { center }
+ l { west }
+ r { east }
+ }
+
+ }
+ T {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { north }
+ l { north~west }
+ r { north~east }
+ }
+
+ }
+ B {
+ \str_case:Vn \l_@@_hpos_block_str
+ {
+ c { south}
+ l { south~west }
+ r { south~east }
+ }
+
+ }
+ }
+ }
+% \end{macrocode}
+% \begin{macrocode}
+ \pgftransformshift
+ {
+ \pgfpointanchor
+ {
+ \@@_env: - #1 - #2 - block
+ \bool_if:NF \l_@@_hpos_of_block_cap_bool { - short }
+ }
+ { \l_tmpa_tl }
}
+ \pgfset { inner~xsep = \c_zero_dim }
+ \pgfnode
+ { rectangle }
+ { \l_tmpa_tl }
+ { \box_use_drop:N \l_@@_cell_box } { } { }
+ }
+% \end{macrocode}
+%
+% \begin{macrocode}
+ {
% \end{macrocode}
-% If the block has only one row, we want the label of the block perfectly
-% aligned on the baseline of the row. That's why we have constructed a
-% |\pgfcoordinate| on the baseline of the row, in the first column of the array.
-% Now, we retrieve the $y$-value of that node and we store it in |\l_tmpa_dim|.
+%
% \begin{macrocode}
- \pgfextracty \l_tmpa_dim { \@@_qpoint:n { row - #1 - base } }
+ \pgfextracty \l_tmpa_dim
+ {
+ \@@_qpoint:n
+ {
+ row - \str_if_eq:VnTF \l_@@_vpos_of_block_str { b } { #3 } { #1 }
+ - base
+ }
+ }
% \end{macrocode}
% We retrieve (in |\pgf@x|) the $x$-value of the center of the block.
% \begin{macrocode}
@@ -18251,51 +18494,7 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-% \medskip
-% If the number of rows is different of $1$, we will put the label of the block
-% by using the short node (the label of the block has been composed in
-% |\l_@@_cell_box|).
-% \begin{macrocode}
- {
-% \end{macrocode}
-% If we are in the first column, we must put the block as if it was with the key~|r|.
% \begin{macrocode}
- \int_compare:nNnT { #2 } = 0
- { \str_set:Nn \l_@@_hpos_block_str r }
- \bool_if:nT \g_@@_last_col_found_bool
- {
- \int_compare:nNnT { #2 } = \g_@@_col_total_int
- { \str_set:Nn \l_@@_hpos_block_str l }
- }
- \pgftransformshift
- {
- \pgfpointanchor
- {
- \@@_env: - #1 - #2 - block
- \bool_if:NF \l_@@_hpos_of_block_cap_bool { - short }
- }
- {
- \str_case:Vn \l_@@_hpos_block_str
- {
- c { center }
- l { west }
- r { east }
- }
- }
- }
- \pgfset { inner~sep = \c_zero_dim }
- \pgfnode
- { rectangle }
- {
- \str_case:Vn \l_@@_hpos_block_str
- {
- c { center }
- l { west }
- r { east }
- }
- }
- { \box_use_drop:N \l_@@_cell_box } { } { }
- }
\endpgfpicture
\group_end:
}
@@ -20611,14 +20810,6 @@ version 2005/12/01 or later.
}
% \end{macrocode}
%
-% \begin{macrocode}
-\@@_msg_new:nn { Wrong~use~of~v-center }
- {
- Wrong~use~of~v-center.\\
- You~should~not~use~the~key~'v-center'~here~because~your~block~is~not~
- mono-row.~However,~you~can~go~on.
- }
-% \end{macrocode}
%
% \begin{macrocode}
\@@_msg_new:nn { No~letter~and~no~command }
@@ -20964,9 +21155,9 @@ version 2005/12/01 or later.
\c_@@_available_keys_str
}
{
- The~available~keys~are~(in~alphabetic~order):~b,~borders,~c,~draw,~fill,~
- hlines,~hvlines,~l,~line-width,~name,~rounded-corners,~r,~respect-arraystretch,
- ~t,~tikz,~transparent~and~vlines.
+ The~available~keys~are~(in~alphabetic~order):~b,~B,~borders,~c,~draw,~fill,~
+ hlines,~hvlines,~l,~line-width,~name,~rounded-corners,~r,~respect-arraystretch,~
+ t,~T,~tikz,~transparent~and~vlines.
}
% \end{macrocode}
%
@@ -21371,7 +21562,10 @@ version 2005/12/01 or later.
% \small
% \nolinkurl{https:www.tug.org/svn/texlive/trunk/Master/texmf-dist/tex/latex/nicematrix/nicematrix.sty}
% }
+% \subsection*{Changes between version 6.13 and 6.14}
%
+% New keys for the command |\Block| for the vertical position of the content of
+% that block.
%
% \subsection*{Changes between version 6.12 and 6.13}
%
diff --git a/macros/latex/contrib/nicematrix/nicematrix.pdf b/macros/latex/contrib/nicematrix/nicematrix.pdf
index 76fa5d3fe8..92cfeea69c 100644
--- a/macros/latex/contrib/nicematrix/nicematrix.pdf
+++ b/macros/latex/contrib/nicematrix/nicematrix.pdf
Binary files differ
diff --git a/macros/latex/contrib/soulutf8/README.md b/macros/latex/contrib/soulutf8/README.md
deleted file mode 100644
index 9c9fc7381c..0000000000
--- a/macros/latex/contrib/soulutf8/README.md
+++ /dev/null
@@ -1,17 +0,0 @@
-# soulutf8
-
-soulutf8 package for latex
-
-
-This repository is a fork of https://github.com/drehscheibe/soul
-
-Currently the files forked from soul are unused.
-Just used to build the extension soulutf8 originally by Heiko Oberdiek.
-
-## soulutf8
-
-This package extends package soul and adds some support
-for UTF-8. Namely the input encodings utf8.def
-from package inputenc and
-package ucs's utf8x.def are supported.
-
diff --git a/macros/latex/contrib/soulutf8/soulutf8.dtx b/macros/latex/contrib/soulutf8/soulutf8.dtx
deleted file mode 100644
index 46afd8c29f..0000000000
--- a/macros/latex/contrib/soulutf8/soulutf8.dtx
+++ /dev/null
@@ -1,1298 +0,0 @@
-% \iffalse meta-comment
-%
-% File: soulutf8.dtx
-% Version: 2019/12/15 v1.2
-% Info: Permit use of UTF-8 characters in soul
-%
-% Copyright (C)
-% 2007 Heiko Oberdiek
-% 2016-2019 Oberdiek Package Support Group
-% https://github.com/ho-tex/soul/issues
-%
-% This work may be distributed and/or modified under the
-% conditions of the LaTeX Project Public License, either
-% version 1.3c of this license or (at your option) any later
-% version. This version of this license is in
-% https://www.latex-project.org/lppl/lppl-1-3c.txt
-% and the latest version of this license is in
-% https://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 Maintainers of this work are
-% Heiko Oberdiek and the Oberdiek Package Support Group
-% https://github.com/ho-tex/soul/issues
-%
-% The Base Interpreter refers to any `TeX-Format',
-% because some files are installed in TDS:tex/generic//.
-%
-% This work consists of the main source file soulutf8.dtx
-% and the derived files
-% soulutf8.sty, soulutf8.pdf, soulutf8.ins, soulutf8.drv,
-% soulutf8-test1.tex, soulutf8-test2.tex, soulutf8-test3.tex,
-% soulutf8-test4.tex, soulutf8-test5.tex.
-%
-% Distribution:
-% CTAN:macros/latex/contrib/soulutf8/soulutf8.dtx
-% CTAN:macros/latex/contrib/soulutf8/soulutf8.pdf
-%
-% Unpacking:
-% (a) If soulutf8.ins is present:
-% tex soulutf8.ins
-% (b) Without soulutf8.ins:
-% tex soulutf8.dtx
-% (c) If you insist on using LaTeX
-% latex \let\install=y\input{soulutf8.dtx}
-% (quote the arguments according to the demands of your shell)
-%
-% Documentation:
-% (a) If soulutf8.drv is present:
-% latex soulutf8.drv
-% (b) Without soulutf8.drv:
-% latex soulutf8.dtx; ...
-% The class ltxdoc loads the configuration file ltxdoc.cfg
-% if available. Here you can specify further options, e.g.
-% use A4 as paper format:
-% \PassOptionsToClass{a4paper}{article}
-%
-% Programm calls to get the documentation (example):
-% pdflatex soulutf8.dtx
-% makeindex -s gind.ist soulutf8.idx
-% pdflatex soulutf8.dtx
-% makeindex -s gind.ist soulutf8.idx
-% pdflatex soulutf8.dtx
-%
-% Installation:
-% TDS:tex/generic/soulutf8/soulutf8.sty
-% TDS:doc/latex/soulutf8/soulutf8.pdf
-% TDS:source/latex/soulutf8/soulutf8.dtx
-%
-%<*ignore>
-\begingroup
- \catcode123=1 %
- \catcode125=2 %
- \def\x{LaTeX2e}%
-\expandafter\endgroup
-\ifcase 0\ifx\install y1\fi\expandafter
- \ifx\csname processbatchFile\endcsname\relax\else1\fi
- \ifx\fmtname\x\else 1\fi\relax
-\else\csname fi\endcsname
-%</ignore>
-%<*install>
-\input docstrip.tex
-\Msg{************************************************************************}
-\Msg{* Installation}
-\Msg{* Package: soulutf8 2019/12/15 v1.2 Permit use of UTF-8 characters in soul (HO)}
-\Msg{************************************************************************}
-
-\keepsilent
-\askforoverwritefalse
-
-\let\MetaPrefix\relax
-\preamble
-
-This is a generated file.
-
-Project: soulutf8
-Version: 2019/12/15 v1.2
-
-Copyright (C)
- 2007 Heiko Oberdiek
- 2016-2019 Oberdiek Package Support Group
-
-This work may be distributed and/or modified under the
-conditions of the LaTeX Project Public License, either
-version 1.3c of this license or (at your option) any later
-version. This version of this license is in
- https://www.latex-project.org/lppl/lppl-1-3c.txt
-and the latest version of this license is in
- https://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 Maintainers of this work are
-Heiko Oberdiek and the Oberdiek Package Support Group
-https://github.com/ho-tex/soul/issues
-
-
-The Base Interpreter refers to any `TeX-Format',
-because some files are installed in TDS:tex/generic//.
-
-This work consists of the main source file soulutf8.dtx
-and the derived files
- soulutf8.sty, soulutf8.pdf, soulutf8.ins, soulutf8.drv,
- soulutf8-test1.tex, soulutf8-test2.tex, soulutf8-test3.tex,
- soulutf8-test4.tex, soulutf8-test5.tex.
-
-\endpreamble
-\let\MetaPrefix\DoubleperCent
-
-\generate{%
- \file{soulutf8.ins}{\from{soulutf8.dtx}{install}}%
- \file{soulutf8.drv}{\from{soulutf8.dtx}{driver}}%
- \usedir{tex/generic/soulutf8}%
- \file{soulutf8.sty}{\from{soulutf8.dtx}{package}}%
-}
-
-\catcode32=13\relax% active space
-\let =\space%
-\Msg{************************************************************************}
-\Msg{*}
-\Msg{* To finish the installation you have to move the following}
-\Msg{* file into a directory searched by TeX:}
-\Msg{*}
-\Msg{* soulutf8.sty}
-\Msg{*}
-\Msg{* To produce the documentation run the file `soulutf8.drv'}
-\Msg{* through LaTeX.}
-\Msg{*}
-\Msg{* Happy TeXing!}
-\Msg{*}
-\Msg{************************************************************************}
-
-\endbatchfile
-%</install>
-%<*ignore>
-\fi
-%</ignore>
-%<*driver>
-\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{soulutf8.drv}%
- [2019/12/15 v1.2 Permit use of UTF-8 characters in soul (HO)]%
-\documentclass{ltxdoc}
-\usepackage{holtxdoc}[2011/11/22]
-\begin{document}
- \DocInput{soulutf8.dtx}%
-\end{document}
-%</driver>
-% \fi
-%
-%
-%
-% \GetFileInfo{soulutf8.drv}
-%
-% \title{The \xpackage{soulutf8} package}
-% \date{2019/12/15 v1.2}
-% \author{Heiko Oberdiek\thanks
-% {Please report any issues at \url{https://github.com/ho-tex/soul/issues}}}
-%
-% \maketitle
-%
-% \begin{abstract}
-% This package extends package \xpackage{soul} and adds some support
-% for UTF-8. Namely the input encodings \xfile{utf8.def}
-% from package \xpackage{inputenc} and
-% package \xpackage{ucs}'s \xfile{utf8x.def} are supported.
-% \end{abstract}
-%
-% \tableofcontents
-%
-% \section{Documentation}
-%
-% This package \xpackage{soulutf8} does not have own options and does not
-% define new user commands.
-% Any option is passed to package \xpackage{soul} \cite{soul}
-% that is loaded first.
-% Then some internal macros of \xpackage{soul} are redefined to add
-% support for UTF-8.
-% The following input encodings are supported:
-% \begin{quote}
-% \begin{tabular}{@{}lll@{}}
-% \texttt{utf8} & \LaTeX\ base &
-% \xfile{TDS:tex/latex/base/utf8.def} \cite{utf8}\\
-% \texttt{utf8x} & Package \xpackage{ucs} &
-% \xfile{TDS:tex/latex/ucs/utf8x.def} \cite{ucs}\\
-% \end{tabular}
-% \end{quote}
-% UTF-8 byte sequences are added as token group to a word, even
-% if these UTF-8 characters are some kind of hyphen or space.
-% As exception the following three Unicode characters are handled specially:
-% \begin{quote}
-% \begin{tabular}{lll}
-% Slot & Name & Action\\
-% \hline
-% \texttt{U+00A0} & NO-BREAK SPACE & like |~|\\
-% \texttt{U+2013} & EN DASH & |--|\\
-% \texttt{U+2014} & EM DASH & |---|
-% \end{tabular}
-%
-% \subsection{Patch}
-%
-% Also package \xpackage{soulutf8} tries to patch package \xpackage{soul}
-% to improve its behaviour:
-% \begin{itemize}
-% \item
-% A problem with additional levels of curly braces is fixed.
-% As advantage more implicite kernings are detected.
-% However, the result may be incompatible with the
-% original behaviour of package \xpackage{soul} because
-% of these respected implicite kernings.
-% \item
-% \eTeX\ , especially \cs{unexpanded} is supported.
-% This allows a better protection of token groups
-% (|\mbox{|\dots|}|, math, \dots).
-% \end{itemize}
-% \end{quote}
-%
-% \subsection{Future}
-%
-% Currently package \xpackage{soul} does not seem to be
-% maintained. Nevertheless if there will be a new version that
-% adds support for UTF-8, then this package may become
-% obsolete.
-%
-% \StopEventually{
-% }
-%
-% \section{Implementation}
-%
-% \begin{macrocode}
-%<*package>
-% \end{macrocode}
-%
-% \subsection{Reload check and package identification}
-% Reload check, especially if the package is not used with \LaTeX.
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode35=6 % #
- \catcode39=12 % '
- \catcode44=12 % ,
- \catcode45=12 % -
- \catcode46=12 % .
- \catcode58=12 % :
- \catcode64=11 % @
- \catcode123=1 % {
- \catcode125=2 % }
- \expandafter\let\expandafter\x\csname ver@soulutf8.sty\endcsname
- \ifx\x\relax % plain-TeX, first loading
- \else
- \def\empty{}%
- \ifx\x\empty % LaTeX, first loading,
- % variable is initialized, but \ProvidesPackage not yet seen
- \else
- \expandafter\ifx\csname PackageInfo\endcsname\relax
- \def\x#1#2{%
- \immediate\write-1{Package #1 Info: #2.}%
- }%
- \else
- \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
- \fi
- \x{soulutf8}{The package is already loaded}%
- \aftergroup\endinput
- \fi
- \fi
-\endgroup%
-% \end{macrocode}
-% Package identification:
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode35=6 % #
- \catcode39=12 % '
- \catcode40=12 % (
- \catcode41=12 % )
- \catcode44=12 % ,
- \catcode45=12 % -
- \catcode46=12 % .
- \catcode47=12 % /
- \catcode58=12 % :
- \catcode64=11 % @
- \catcode91=12 % [
- \catcode93=12 % ]
- \catcode123=1 % {
- \catcode125=2 % }
- \expandafter\ifx\csname ProvidesPackage\endcsname\relax
- \def\x#1#2#3[#4]{\endgroup
- \immediate\write-1{Package: #3 #4}%
- \xdef#1{#4}%
- }%
- \else
- \def\x#1#2[#3]{\endgroup
- #2[{#3}]%
- \ifx#1\@undefined
- \xdef#1{#3}%
- \fi
- \ifx#1\relax
- \xdef#1{#3}%
- \fi
- }%
- \fi
-\expandafter\x\csname ver@soulutf8.sty\endcsname
-\ProvidesPackage{soulutf8}%
- [2019/12/15 v1.2 Permit use of UTF-8 characters in soul (HO)]%
-% \end{macrocode}
-%
-% \subsection{Catcodes}
-%
-% \begin{macrocode}
-\begingroup\catcode61\catcode48\catcode32=10\relax%
- \catcode13=5 % ^^M
- \endlinechar=13 %
- \catcode123=1 % {
- \catcode125=2 % }
- \catcode64=11 % @
- \def\x{\endgroup
- \expandafter\edef\csname SOuL@AtEnd\endcsname{%
- \endlinechar=\the\endlinechar\relax
- \catcode13=\the\catcode13\relax
- \catcode32=\the\catcode32\relax
- \catcode35=\the\catcode35\relax
- \catcode61=\the\catcode61\relax
- \catcode64=\the\catcode64\relax
- \catcode123=\the\catcode123\relax
- \catcode125=\the\catcode125\relax
- }%
- }%
-\x\catcode61\catcode48\catcode32=10\relax%
-\catcode13=5 % ^^M
-\endlinechar=13 %
-\catcode35=6 % #
-\catcode64=11 % @
-\catcode123=1 % {
-\catcode125=2 % }
-\def\TMP@EnsureCode#1#2{%
- \edef\SOuL@AtEnd{%
- \SOuL@AtEnd
- \catcode#1=\the\catcode#1\relax
- }%
- \catcode#1=#2\relax
-}
-\TMP@EnsureCode{10}{12}% ^^J
-\TMP@EnsureCode{33}{12}% !
-\TMP@EnsureCode{34}{12}% "
-\TMP@EnsureCode{36}{3}% $
-\TMP@EnsureCode{39}{12}% '
-\TMP@EnsureCode{40}{12}% (
-\TMP@EnsureCode{41}{12}% )
-\TMP@EnsureCode{42}{12}% *
-\TMP@EnsureCode{43}{12}% +
-\TMP@EnsureCode{44}{12}% ,
-\TMP@EnsureCode{45}{12}% -
-\TMP@EnsureCode{46}{12}% .
-\TMP@EnsureCode{47}{12}% /
-\TMP@EnsureCode{58}{12}% :
-\TMP@EnsureCode{60}{12}% <
-\TMP@EnsureCode{62}{12}% >
-\TMP@EnsureCode{91}{12}% [
-\TMP@EnsureCode{93}{12}% ]
-\TMP@EnsureCode{94}{7}% ^
-\TMP@EnsureCode{96}{12}% `
-\TMP@EnsureCode{126}\active % ~
-\TMP@EnsureCode{128}{12}% ^^80
-\TMP@EnsureCode{147}{12}% ^^93
-\TMP@EnsureCode{148}{12}% ^^94
-\TMP@EnsureCode{160}{12}% ^^a0
-\TMP@EnsureCode{194}{12}% ^^c2
-\TMP@EnsureCode{226}{12}% ^^e2
-\edef\SOuL@AtEnd{\SOuL@AtEnd\noexpand\endinput}
-% \end{macrocode}
-%
-% \subsection{Loading packages}
-%
-% Package \xpackage{soul} uses \cs{documentclass} to detect \LaTeX.
-% \begin{macrocode}
-\ifx\documentclass\@undefined
-% \end{macrocode}
-%
-% \subsubsection{\plainTeX}
-%
-% First we check, whether package \xpackage{soul} is already loaded.
-% \begin{macrocode}
- \expandafter\ifx\csname SOUL@\endcsname\relax
-% \end{macrocode}
-% In case of \plainTeX\ package \xpackage{soul} defines some
-% macros in a simple manner that will break the definitions of
-% \xfile{miniltx.tex}, for example. Therefore these macros
-% are first saved and restored afterwards.
-% \begin{macrocode}
- \let\SOuL@orgDeclareRobustCommand\DeclareRobustCommand
- \let\SOuL@orgnewcommand \newcommand
- \let\SOuL@orgDeclareOption \DeclareOption
- \let\SOuL@orgPackageError \PackageError
- \def\SOuL@restorelatexcmds{%
- \let\DeclareRobustCommand\SOuL@orgDeclareRobustCommand
- \let\newcommand \SOuL@orgnewcommand
- \let\DeclareOption \SOuL@orgDeclareOption
- \let\PackageError \SOuL@orgPackageError
- }%
- \input soul.sty\relax
- \SOuL@restorelatexcmds
- \fi
-% \end{macrocode}
-% \begin{macro}{\SOUL@error}
-% Package \xpackage{soul}'s use of \cs{PackageError} is replaced
-% by \cs{@PackageError} of package \xpackage{infwarerr}.
-% \begin{macrocode}
- \input infwarerr.sty\relax
- \let\SOuL@orgSOUL@error\SOUL@error
- \def\SOUL@error{%
- \begingroup
- \let\PackageError\@PackageError
- \SOuL@orgSOUL@error
- \endgroup
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
- \input etexcmds.sty\relax
-% \end{macrocode}
-% \begin{macro}{\@onelevel@sanitize}
-% Define \LaTeX's \cs{@onelevel@sanitize} if not already available.
-% \begin{macrocode}
- \expandafter\ifx\csname @onelevel@sanitize\endcsname\relax
- \def\@onelevel@sanitize#1{%
- \edef#1{%
- \expandafter\strip@prefix\meaning#1%
- }%
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\strip@prefix}
-% \begin{macrocode}
- \def\strip@prefix#1>{}%
-% \end{macrocode}
-% \end{macro}
-% \begin{macrocode}
- \fi
-\else
-% \end{macrocode}
-%
-% \subsubsection{\LaTeX}
-% \begin{macrocode}
- \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{soul}}%
- \ProcessOptions\relax
- \RequirePackage{soul}[2003/11/17]%
- \RequirePackage{infwarerr}[2019/12/03]%
- \RequirePackage{etexcmds}[2019/12/15]%
-\fi
-% \end{macrocode}
-%
-% \subsubsection{\eTeX}
-%
-% In \plainTeX\ command \cs{+} is an \emph{outer} macro.
-% Therefore numbers are used to avoid problems.
-% \begin{macrocode}
-\ifetex@unexpanded
- \catcode33=14 % '!': comment
- \catcode43=9 % '+': ignore
-\else
- \catcode33=9 % '!': ignore
- \catcode43=14 % '+': comment
-\fi
-% \end{macrocode}
-%
-% \subsection{Macro for redefinitions}
-%
-% \begin{macro}{\SOuL@redefine}
-% \begin{macrocode}
-\def\SOuL@redefine#1{%
- \begingroup
- \def\SOuL@cmd{#1}%
- \afterassignment\SOuL@cmdcheck
- \def\SOuL@temp
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOuL@cmdcheck}
-% \begin{macrocode}
-\def\SOuL@cmdcheck{%
- \expandafter\ifx\SOuL@cmd\SOuL@temp
- \else
- \edef\SOuL@temp*{\expandafter\string\SOuL@cmd}%
- \@PackageWarningNoLine{soulutf8}{%
- Command \SOuL@temp* has changed.\MessageBreak
- Supported versions of package `soul': 2003/11/17.\MessageBreak
- Depending on the unknown changes the redefinition\MessageBreak
- of \SOuL@temp* may not behave correctly%
- }%
- \fi
- \expandafter\endgroup
- \expandafter\def\SOuL@cmd
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Redefinition of \cs{SOUL@eval}}
-%
-% \begin{macro}{\SOUL@eval}
-% Macro \cs{SOUL@eval} is redefined to add detection of
-% the first byte of a UTF-8 sequence. Because \cs{SOUL@eval}
-% is overwritten, a warning is issued, if the contents of
-% \cs{SOUL@eval} is not as expected.
-% \begin{macrocode}
-\SOuL@redefine\SOUL@eval{%
-% \end{macrocode}
-% First the expected definition.
-% \begin{macrocode}
- \def\SOUL@n*##1{\SOUL@scan}%
- \if\noexpand\SOUL@@\SOUL@spc
- \else
- \SOUL@ignorespacesfalse
- \fi
- \ifnum\SOUL@minus=\thr@@
- \SOUL@flushminus
- \else\ifnum\SOUL@comma=\tw@
- \SOUL@flushcomma
- \else\ifnum\SOUL@apo=\tw@
- \SOUL@flushapo
- \else\ifnum\SOUL@grave=\tw@
- \SOUL@flushgrave
- \fi\fi\fi\fi
- \ifx\SOUL@@-\else\SOUL@flushminus\fi
- \ifx\SOUL@@,\else\SOUL@flushcomma\fi
- \ifx\SOUL@@'\else\SOUL@flushapo\fi
- \ifx\SOUL@@`\else\SOUL@flushgrave\fi
- \ifx\SOUL@@-%
- \advance\SOUL@minus\@ne
- \else\ifx\SOUL@@,%
- \advance\SOUL@comma\@ne
- \else\ifx\SOUL@@'%
- \advance\SOUL@apo\@ne
- \else\ifx\SOUL@@`%
- \advance\SOUL@grave\@ne
- \else
- \SOUL@flushminus
- \SOUL@flushcomma
- \SOUL@flushapo
- \SOUL@flushgrave
- \ifx\SOUL@@\SOUL@stop
- \def\SOUL@n*{%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- }%
- \else\ifx\SOUL@@\par
- \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
- \else\if\noexpand\SOUL@@\SOUL@spc
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \ifSOUL@ignorespaces
- \else
- \SOUL@everyspace{}%
- \fi
- \def\SOUL@n* {\SOUL@scan}%
- \else\ifx\SOUL@@\\%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\unskip\nobreak\hfil\break}%
- \SOUL@ignorespacestrue
- \else\ifx\SOUL@@~%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\nobreak}%
- \else\ifx\SOUL@@\slash
- \SOUL@doword
- \SOUL@eventuallyexhyphen{/}%
- \SOUL@exhyphen{/}%
- \else\ifx\SOUL@@\mbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\hbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\soulomit
- \def\SOUL@n*\soulomit##1{%
- \SOUL@doword
- {\spaceskip\SOUL@spaceskip##1}%
- \SOUL@scan
- }%
- \else\ifx\SOUL@@\break
- \SOUL@doword
- \break
- \else\ifx\SOUL@@\linebreak
- \SOUL@doword
- \SOUL@everyspace{\linebreak}%
- \else\ifcat\bgroup\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addgroup{}}%
- \else\ifcat$\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addmath}%
- \else
- \def\SOUL@n*{\SOUL@dotoken}%
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi\fi\fi\fi
- \SOUL@n*%
-}{%
-% \end{macrocode}
-% Now the redefined version follows.
-% \begin{macrocode}
- \def\SOUL@n*##1{\SOUL@scan}%
- \if\noexpand\SOUL@@\SOUL@spc
- \else
- \SOUL@ignorespacesfalse
- \fi
- \ifnum\SOUL@minus=\thr@@
- \SOUL@flushminus
- \else\ifnum\SOUL@comma=\tw@
- \SOUL@flushcomma
- \else\ifnum\SOUL@apo=\tw@
- \SOUL@flushapo
- \else\ifnum\SOUL@grave=\tw@
- \SOUL@flushgrave
- \fi\fi\fi\fi
- \ifx\SOUL@@-\else\SOUL@flushminus\fi
- \ifx\SOUL@@,\else\SOUL@flushcomma\fi
- \ifx\SOUL@@'\else\SOUL@flushapo\fi
- \ifx\SOUL@@`\else\SOUL@flushgrave\fi
- \ifx\SOUL@@-%
- \advance\SOUL@minus\@ne
- \else\ifx\SOUL@@,%
- \advance\SOUL@comma\@ne
- \else\ifx\SOUL@@'%
- \advance\SOUL@apo\@ne
- \else\ifx\SOUL@@`%
- \advance\SOUL@grave\@ne
- \else
- \SOUL@flushminus
- \SOUL@flushcomma
- \SOUL@flushapo
- \SOUL@flushgrave
- \ifx\SOUL@@\SOUL@stop
- \def\SOUL@n*{%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- }%
- \else\ifx\SOUL@@\par
- \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
- \else\if\noexpand\SOUL@@\SOUL@spc
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \ifSOUL@ignorespaces
- \else
- \SOUL@everyspace{}%
- \fi
- \def\SOUL@n* {\SOUL@scan}%
- \else\ifx\SOUL@@\\%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\unskip\nobreak\hfil\break}%
- \SOUL@ignorespacestrue
- \else\ifx\SOUL@@~%
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\nobreak}%
- \else\ifx\SOUL@@\slash
- \SOUL@doword
- \SOUL@eventuallyexhyphen{/}%
- \SOUL@exhyphen{/}%
- \else\ifx\SOUL@@\mbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\hbox
- \def\SOUL@n*{\SOUL@addprotect}%
- \else\ifx\SOUL@@\soulomit
- \def\SOUL@n*\soulomit##1{%
- \SOUL@doword
- {\spaceskip\SOUL@spaceskip##1}%
- \SOUL@scan
- }%
- \else\ifx\SOUL@@\break
- \SOUL@doword
- \break
- \else\ifx\SOUL@@\linebreak
- \SOUL@doword
- \SOUL@everyspace{\linebreak}%
- \else\ifcat\bgroup\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addgroup{}}%
- \else\ifcat$\noexpand\SOUL@@
- \def\SOUL@n*{\SOUL@addmath}%
- \else
-% \end{macrocode}
-% The current token is examined to detect the start of
-% a UTF-8 sequence.
-% \begin{macrocode}
- \SOuL@analyzeutfviii
- \ifcase\SOuL@octets
- \SOuL@analyzeutfviiix
- \fi
- \ifcase\SOuL@octets
- \def\SOUL@n*{\SOUL@dotoken}%
- \or % 1
- \or % 2
- \def\SOUL@n*{\SOuL@addtwooctets}%
- \or % 3
- \def\SOUL@n*{\SOuL@addthreeoctets}%
- \or % 4
- \def\SOUL@n*{\SOuL@addfouroctets}%
- \fi
- \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
- \fi\fi\fi\fi
- \SOUL@n*%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{UTF-8 analysis}
-%
-% \subsubsection{Help strings}
-%
-% \begin{macrocode}
-\def\SOuL@defsanitizedstring#1#2{%
- \expandafter\def\csname SOuL@string#1\endcsname{#2}%
- \expandafter\@onelevel@sanitize\csname SOuL@string#1\endcsname
-}
-\SOuL@defsanitizedstring{UTFviii}{UTFviii@}
-\SOuL@defsanitizedstring{octets}{@octets}
-\SOuL@defsanitizedstring{two}{two}
-\SOuL@defsanitizedstring{three}{three}
-\SOuL@defsanitizedstring{four}{four}
-\SOuL@defsanitizedstring{macrocolon}{macro:}
-\SOuL@defsanitizedstring{csnameu}{csname u8-}
-\SOuL@defsanitizedstring{undeferr}{utf@viii@undeferr}
-\def\SOuL@stringendash{^^e2^^80^^93}
-\def\SOuL@stringemdash{^^e2^^80^^94}
-\def\SOuL@stringnobreakspace{^^c2^^a0}
-\edef\SOuL@charhash{\string #}
-\edef\SOuL@chartwo{\string 2}
-\edef\SOuL@charthree{\string 3}
-\def\SOuL@empty{}
-% \end{macrocode}
-%
-% \subsubsection{Support for \xfile{utf8.def}}
-%
-% \begin{macro}{\SOuL@analyzeutfviii}
-% \begin{macrocode}
-\begingroup
- \edef\x{\endgroup
- \def\noexpand\SOuL@analyzeutfviii{%
- \noexpand\expandafter\noexpand\SOuL@checkutfviii
- \noexpand\meaning\noexpand\SOUL@@
- \SOuL@stringUTFviii\SOuL@stringoctets
- \noexpand\@nil
- }%
- \def\noexpand\SOuL@checkutfviii
- ##1\SOuL@stringUTFviii##2\SOuL@stringoctets##3\noexpand\@nil
- }%
-\x{%
- \def\SOuL@temp{#2}%
- \chardef\SOuL@octets=%
- \ifx\SOuL@temp\SOuL@stringtwo
- \tw@
- \else\ifx\SOuL@temp\SOuL@stringthree
- \thr@@
- \else\ifx\SOuL@temp\SOuL@stringfour
- 4 %
- \else
- \z@
- \fi\fi\fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Support for \xfile{utf8x.def}}
-%
-% \begin{macro}{\SOuL@analyzeutfviiix}
-% \begin{macrocode}
-\begingroup
- \edef\x{\endgroup
- \def\noexpand\SOuL@analyzeutfviiix{%
- \noexpand\expandafter\noexpand\SOuL@checkutfviiix
- \noexpand\meaning\noexpand\SOUL@@
- \SOuL@stringmacrocolon\SOuL@charhash1{}{}{}{}%
- \SOuL@stringcsnameu\SOuL@stringundeferr
- \noexpand\@nil
- }%
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOuL@checkutfviiix}
-% \begin{macrocode}
- \def\noexpand\SOuL@checkutfviiix
- ##1\SOuL@stringmacrocolon\SOuL@charhash1##2##3##4##5##6%
- \SOuL@stringcsnameu##7\SOuL@stringundeferr##8\noexpand\@nil
- }%
-\x{%
- \def\SOuL@temp{#7}%
- \ifx\SOuL@temp\SOuL@empty
- \chardef\SOuL@octets=\z@
- \else
- \def\SOuL@temp{#5}%
- \ifx\SOuL@temp\SOuL@charthree
- \chardef\SOuL@octets=4 %
- \else
- \def\SOuL@temp{#3}%
- \ifx\SOuL@temp\SOuL@chartwo
- \chardef\SOuL@octets=\thr@@
- \else
- \chardef\SOuL@octets=\tw@
- \fi
- \fi
- \fi
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Actions for UTF-8 sequences}
-%
-% \begin{macro}{\SOuL@addtwooctets}
-% \begin{macrocode}
-\def\SOuL@addtwooctets#1#2{%
- \def\SOuL@temp{#1#2}%
- \@onelevel@sanitize\SOuL@temp
- \ifx\SOuL@temp\SOuL@stringnobreakspace
- \SOUL@doword
- \SOUL@eventuallyexhyphen\null
- \SOUL@everyspace{\nobreak}%
- \let\SOuL@next\SOUL@scan
- \else
- \def\SOuL@next{%
-! \SOUL@addtoken{{\noexpand#1\noexpand#2}}%
-+ \SOUL@addtoken{{\etex@unexpanded{#1#2}}}%
- }%
- \fi
- \SOuL@next
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOuL@addthreeoctets}
-% \begin{macrocode}
-\def\SOuL@addthreeoctets#1#2#3{%
- \def\SOuL@temp{#1#2#3}%
- \@onelevel@sanitize\SOuL@temp
- \ifx\SOuL@temp\SOuL@stringendash
- \SOUL@doword
- \SOUL@eventuallyexhyphen{-}%
- \SOUL@exhyphen{--}%
- \let\SOuL@next\SOUL@scan
- \else
- \ifx\SOuL@temp\SOuL@stringemdash
- \SOUL@doword
- \SOUL@eventuallyexhyphen{-}%
- \SOUL@exhyphen{---}%
- \let\SOuL@next\SOUL@scan
- \else
- \def\SOuL@next{%
-! \SOUL@addtoken{{\noexpand#1\noexpand#2\noexpand#3}}%
-+ \SOUL@addtoken{{\etex@unexpanded{#1#2#3}}}%
- }%
- \fi
- \fi
- \SOuL@next
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOuL@addfouroctets}
-% \begin{macrocode}
-\def\SOuL@addfouroctets#1#2#3#4{%
-! \SOUL@addtoken{{\noexpand#1\noexpand#2\noexpand#3\noexpand#4}}%
-+ \SOUL@addtoken{{\etex@unexpanded{#1#2#3#4}}}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsubsection{Redefinition of \cs{SOUL@splittoken}}
-%
-% \begin{macro}{\SOUL@splittoken}
-% Macro \cs{SOUL@splittoken} separates the first token
-% or token group from a word and redefines the word to contain
-% the remaining tokens. However if the remaining tokens are
-% a token group, then the curly braces will be removed and
-% the token group is splitted by the next call of \cs{SOUL@splittoken}.
-% The redefinition avoids the removal of curly braces around the
-% remaining tokens.
-% \begin{macrocode}
-\SOuL@redefine\SOUL@splittoken#1#2\SOUL@stop{%
- \global\SOUL@token={#1}%
- \global\SOUL@word={#2}%
-}#1{%
- \global\SOUL@token={#1}%
- \SOuL@remainingtoken\relax
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOuL@remainingtoken}
-% \begin{macrocode}
-\def\SOuL@remainingtoken#1\SOUL@stop{%
- \global\SOUL@word=\expandafter{\@gobble#1}%
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \subsection{Patches}
-%
-% The fixed \cs{SOUL@splittoken} allows to remove the double
-% sets of curly braces in other macros of package \xpackage{soul}.
-% The benefit is that implicite kernings are more often detected
-% and fixes a bug in package \xpackage{soul}. The disadvantage is
-% incompatibility. The width of the resulting strings may change.
-% \begin{macro}{\SOUL@flushcomma}
-% \begin{macrocode}
-\SOuL@redefine\SOUL@flushcomma{%
- \ifcase\SOUL@comma
- \or
- \edef\x{\SOUL@word={\the\SOUL@word,}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
- \fi
- \SOUL@comma\z@
-}{%
- \ifcase\SOUL@comma
- \or
- \edef\x{\SOUL@word={\the\SOUL@word,}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{,,}}}\x
- \fi
- \SOUL@comma\z@
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOUL@flushapo}
-% \begin{macrocode}
-\SOuL@redefine\SOUL@flushapo{%
- \ifcase\SOUL@apo
- \or
- \edef\x{\SOUL@word={\the\SOUL@word'}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
- \fi
- \SOUL@apo\z@
-}{%
- \ifcase\SOUL@apo
- \or
- \edef\x{\SOUL@word={\the\SOUL@word'}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{''}}}\x
- \fi
- \SOUL@apo\z@
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOUL@flushgrave}
-% \begin{macrocode}
-\SOuL@redefine\SOUL@flushgrave{%
- \ifcase\SOUL@grave
- \or
- \edef\x{\SOUL@word={\the\SOUL@word`}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
- \fi
- \SOUL@grave\z@
-}{%
- \ifcase\SOUL@grave
- \or
- \edef\x{\SOUL@word={\the\SOUL@word`}}\x
- \or
- \edef\x{\SOUL@word={\the\SOUL@word{``}}}\x
- \fi
- \SOUL@grave\z@
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOUL@addgroup}
-% \begin{macrocode}
-\SOuL@redefine\SOUL@addgroup#1#2{%
- {%
- \let\protect\noexpand
- \edef\x{%
- \global\SOUL@word={%
- \the\SOUL@word
- {{\noexpand#1#2}}%
- }%
- }%
- \x
- }%
- \SOUL@scan
-}#1#2{%
- \begingroup
- \let\protect\noexpand
- \edef\x{\endgroup
- \SOUL@word={%
- \the\SOUL@word
-! {\noexpand#1{#2}}%
-+ {\etex@unexpanded{#1{#2}}}%
- }%
- }%
- \x
- \SOUL@scan
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOUL@addmath}
-% \begin{macrocode}
-\SOuL@redefine\SOUL@addmath$#1${%
- {%
- \let\protect\noexpand
- \edef\x{%
- \global\SOUL@word={%
- \the\SOUL@word
- {{\hbox{$#1$}}}%
- }%
- }%
- \x
- }%
- \SOUL@scan
-}$#1${%
- \begingroup
- \let\protect\noexpand
- \edef\x{\endgroup
- \SOUL@word={%
- \the\SOUL@word
-! {\hbox{$#1$}}%
-+ {\etex@unexpanded{\hbox{$#1$}}}%
- }%
- }%
- \x
- \SOUL@scan
-}
-% \end{macrocode}
-% \end{macro}
-% \begin{macro}{\SOUL@addprotect}
-% \begin{macrocode}
-\SOuL@redefine\SOUL@addprotect#1#2{%
- {%
- \let\protect\noexpand
- \edef\x{%
- \global\SOUL@word={%
- \the\SOUL@word
- {{\hbox{#2}}}%
- }%
- }%
- \x
- }%
- \SOUL@scan
-}#1#2{%
- \begingroup
- \let\protect\noexpand
- \edef\x{\endgroup
- \SOUL@word={%
- \the\SOUL@word
-! {\hbox{#2}}%
-+ {\etex@unexpanded{\hbox{#2}}}%
- }%
- }%
- \x
- \SOUL@scan
-}
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macro}{\SOUL@addtoken}
-% \begin{macrocode}
-+ \SOuL@redefine\SOUL@addtoken#1{%
-+ \edef\x{%
-+ \SOUL@word={%
-+ \the\SOUL@word
-+ \noexpand#1%
-+ }%
-+ }%
-+ \x
-+ \SOUL@scan
-+ }#1{%
-+ \edef\x{%
-+ \SOUL@word={%
-+ \the\SOUL@word
-+ \etex@unexpanded{#1}%
-+ }%
-+ }%
-+ \x
-+ \SOUL@scan
-+ }%
-% \end{macrocode}
-% \end{macro}
-%
-% \begin{macrocode}
-\SOuL@AtEnd%
-% \end{macrocode}
-%
-% \begin{macrocode}
-%</package>
-% \end{macrocode}
-%% \section{Installation}
-%
-% \subsection{Download}
-%
-% \paragraph{Package.} This package is available on
-% CTAN\footnote{\CTANpkg{soulutf8}}:
-% \begin{description}
-% \item[\CTAN{macros/latex/contrib/soulutf8/soulutf8.dtx}] The source file.
-% \item[\CTAN{macros/latex/contrib/soulutf8/soulutf8.pdf}] Documentation.
-% \end{description}
-%
-%
-% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
-% are also available in a TDS compliant ZIP archive. There
-% the packages are already unpacked and the documentation files
-% are generated. The files and directories obey the TDS standard.
-% \begin{description}
-% \item[\CTANinstall{install/macros/latex/contrib/soulutf8.tds.zip}]
-% \end{description}
-% \emph{TDS} refers to the standard ``A Directory Structure
-% for \TeX\ Files'' (\CTANpkg{tds}). Directories
-% with \xfile{texmf} in their name are usually organized this way.
-%
-% \subsection{Bundle installation}
-%
-% \paragraph{Unpacking.} Unpack the \xfile{oberdiek.tds.zip} in the
-% TDS tree (also known as \xfile{texmf} tree) of your choice.
-% Example (linux):
-% \begin{quote}
-% |unzip oberdiek.tds.zip -d ~/texmf|
-% \end{quote}
-%
-% \subsection{Package installation}
-%
-% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
-% \docstrip\ archive. The files are extracted by running the
-% \xfile{.dtx} through \plainTeX:
-% \begin{quote}
-% \verb|tex soulutf8.dtx|
-% \end{quote}
-%
-% \paragraph{TDS.} Now the different files must be moved into
-% the different directories in your installation TDS tree
-% (also known as \xfile{texmf} tree):
-% \begin{quote}
-% \def\t{^^A
-% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
-% soulutf8.sty & tex/generic/soulutf8/soulutf8.sty\\
-% soulutf8.pdf & doc/latex/soulutf8/soulutf8.pdf\\
-% soulutf8.dtx & source/latex/soulutf8/soulutf8.dtx\\
-% \end{tabular}^^A
-% }^^A
-% \sbox0{\t}^^A
-% \ifdim\wd0>\linewidth
-% \begingroup
-% \advance\linewidth by\leftmargin
-% \advance\linewidth by\rightmargin
-% \edef\x{\endgroup
-% \def\noexpand\lw{\the\linewidth}^^A
-% }\x
-% \def\lwbox{^^A
-% \leavevmode
-% \hbox to \linewidth{^^A
-% \kern-\leftmargin\relax
-% \hss
-% \usebox0
-% \hss
-% \kern-\rightmargin\relax
-% }^^A
-% }^^A
-% \ifdim\wd0>\lw
-% \sbox0{\small\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\footnotesize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\scriptsize\t}^^A
-% \ifdim\wd0>\linewidth
-% \ifdim\wd0>\lw
-% \sbox0{\tiny\t}^^A
-% \ifdim\wd0>\linewidth
-% \lwbox
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \else
-% \lwbox
-% \fi
-% \else
-% \usebox0
-% \fi
-% \end{quote}
-% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
-% TDS installing feature, then some files can already be in the right
-% place, see the documentation of \docstrip.
-%
-% \subsection{Refresh file name databases}
-%
-% If your \TeX~distribution
-% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
-% these. For example, \TeX\,Live\ users run \verb|texhash| or
-% \verb|mktexlsr|.
-%
-% \subsection{Some details for the interested}
-%
-% \paragraph{Unpacking with \LaTeX.}
-% The \xfile{.dtx} chooses its action depending on the format:
-% \begin{description}
-% \item[\plainTeX:] Run \docstrip\ and extract the files.
-% \item[\LaTeX:] Generate the documentation.
-% \end{description}
-% If you insist on using \LaTeX\ for \docstrip\ (really,
-% \docstrip\ does not need \LaTeX), then inform the autodetect routine
-% about your intention:
-% \begin{quote}
-% \verb|latex \let\install=y\input{soulutf8.dtx}|
-% \end{quote}
-% Do not forget to quote the argument according to the demands
-% of your shell.
-%
-% \paragraph{Generating the documentation.}
-% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
-% the documentation. The process can be configured by the
-% configuration file \xfile{ltxdoc.cfg}. For instance, put this
-% line into this file, if you want to have A4 as paper format:
-% \begin{quote}
-% \verb|\PassOptionsToClass{a4paper}{article}|
-% \end{quote}
-% An example follows how to generate the
-% documentation with pdf\LaTeX:
-% \begin{quote}
-%\begin{verbatim}
-%pdflatex soulutf8.dtx
-%makeindex -s gind.ist soulutf8.idx
-%pdflatex soulutf8.dtx
-%makeindex -s gind.ist soulutf8.idx
-%pdflatex soulutf8.dtx
-%\end{verbatim}
-% \end{quote}
-%
-% \begin{thebibliography}{9}
-%
-% \bibitem{soul}
-% Melchior Franz: \textit{The \xpackage{soul} package};
-% 2003/11/17;\\
-% \CTANpkg{soul}.
-%
-% \bibitem{ucs}
-% Dominique P. G. Unruh: \textit{\xpackage{ucs.sty} -- Unicode Support};
-% 2004/10/17;\\
-% \CTANpkg{unicode}.
-%
-% \bibitem{utf8}
-% Frank Mittelbach, Chris Rowley:
-% \textit{Providing some UTF-8 support via \xpackage{inputenc}};
-% 2006/03/30;\\
-% \CTAN{macros/latex/base/utf8ienc.dtx}.
-%
-% \end{thebibliography}
-%
-% \begin{History}
-% \begin{Version}{2007/09/09 v1.0}
-% \item
-% First version.
-% \end{Version}
-% \begin{Version}{2016/05/16 v1.1}
-% \item
-% Documentation updates.
-% \end{Version}
-% \begin{Version}{2019/12/15 v1.2}
-% \item
-% Documentation updates.
-% \end{Version}
-% \end{History}
-%
-% \PrintIndex
-%
-% \Finale
-\endinput
diff --git a/macros/latex/contrib/soulutf8/soulutf8.pdf b/macros/latex/contrib/soulutf8/soulutf8.pdf
deleted file mode 100644
index b8a6565e49..0000000000
--- a/macros/latex/contrib/soulutf8/soulutf8.pdf
+++ /dev/null
Binary files differ
diff --git a/macros/latex/contrib/zref-clever/CHANGELOG.md b/macros/latex/contrib/zref-clever/CHANGELOG.md
index b17e424364..210ad82ccc 100644
--- a/macros/latex/contrib/zref-clever/CHANGELOG.md
+++ b/macros/latex/contrib/zref-clever/CHANGELOG.md
@@ -1,6 +1,11 @@
# Changelog
-## [Unreleased](https://github.com/gusbrs/zref-clever/compare/v0.3.4...HEAD)
+## [Unreleased](https://github.com/gusbrs/zref-clever/compare/v0.3.5...HEAD)
+
+## [v0.3.5](https://github.com/gusbrs/zref-clever/compare/v0.3.4...v0.3.5) (2023-02-18)
+
+### Fixed
+- In tcolorbox how-to, `hyperref` should be loaded before any `\newtcolorbox`es.
## [v0.3.4](https://github.com/gusbrs/zref-clever/compare/v0.3.3...v0.3.4) (2023-02-13)
diff --git a/macros/latex/contrib/zref-clever/zref-clever-code.pdf b/macros/latex/contrib/zref-clever/zref-clever-code.pdf
index 961e8352b8..f1a3809bd0 100644
--- a/macros/latex/contrib/zref-clever/zref-clever-code.pdf
+++ b/macros/latex/contrib/zref-clever/zref-clever-code.pdf
Binary files differ
diff --git a/macros/latex/contrib/zref-clever/zref-clever.dtx b/macros/latex/contrib/zref-clever/zref-clever.dtx
index cd5e8a16f0..69dbe2af0e 100644
--- a/macros/latex/contrib/zref-clever/zref-clever.dtx
+++ b/macros/latex/contrib/zref-clever/zref-clever.dtx
@@ -165,7 +165,7 @@
%
% Identify the package.
% \begin{macrocode}
-\ProvidesExplPackage {zref-clever} {2023-02-13} {0.3.4}
+\ProvidesExplPackage {zref-clever} {2023-02-18} {0.3.5}
{Clever LaTeX cross-references based on zref}
% \end{macrocode}
%
diff --git a/macros/latex/contrib/zref-clever/zref-clever.pdf b/macros/latex/contrib/zref-clever/zref-clever.pdf
index 6fd163eb79..d188a737f9 100644
--- a/macros/latex/contrib/zref-clever/zref-clever.pdf
+++ b/macros/latex/contrib/zref-clever/zref-clever.pdf
Binary files differ
diff --git a/macros/latex/contrib/zref-clever/zref-clever.tex b/macros/latex/contrib/zref-clever/zref-clever.tex
index da92bd751e..138e4e938e 100644
--- a/macros/latex/contrib/zref-clever/zref-clever.tex
+++ b/macros/latex/contrib/zref-clever/zref-clever.tex
@@ -2073,6 +2073,7 @@ with the \opt{label type} option.
\usepackage{tcolorbox}
\tcbuselibrary{theorems}
\tcbset{label is zlabel}
+\usepackage{hyperref}
\newtcolorbox[auto counter,number within=section]{pabox}[2][]{%
label type=example,
title=Example~\thetcbcounter: #2,#1}
@@ -2087,7 +2088,6 @@ with the \opt{label type} option.
Name-pl=Mytheorems,
name-pl=mytheorems,
}
-\usepackage{hyperref}
\begin{document}
\section{Section 1}
\zlabel{sec:section-1}
@@ -2635,8 +2635,11 @@ were generously provided by (in chronological order):
Joseph Wright,
% 2023-01-02: https://chat.stackexchange.com/transcript/message/62684358#62684358
% and following discussion.
- and Thomas F. Sturm.
+ Thomas F. Sturm,
% 2023-02-09: https://github.com/T-F-S/tcolorbox/issues/206
+ and Yukai Chou. % 'muzimuzhi'
+ % 2023-02-18: https://github.com/gusbrs/zref-clever/pull/14
+ % 2023-02-18: https://github.com/gusbrs/zref-clever/pull/15
The package's language files have been provided or improved thanks to:
Denis Bitouzé (French),
diff --git a/macros/xetex/latex/xduts/xduts.dtx b/macros/xetex/latex/xduts/xduts.dtx
index ce50064d89..c295608552 100644
--- a/macros/xetex/latex/xduts/xduts.dtx
+++ b/macros/xetex/latex/xduts/xduts.dtx
@@ -1,7 +1,7 @@
% \iffalse
%<*driver>
\ProvidesFile{xduts.dtx}
-[2023/02/15 v4.4.5.5 Xidian University TeX Suite]
+[2023/02/17 v5.0.0.0 Xidian University TeX Suite]
%</driver>
%<class|sty>\NeedsTeXFormat{LaTeX2e}
%<class|sty>\RequirePackage{expl3}
@@ -9,7 +9,7 @@
%<xduugtp>\ProvidesExplClass{xduugtp}
%<xdupgthesis>\ProvidesExplClass{xdupgthesis}
%<xduugthesis>\ProvidesExplClass{xduugthesis}
-%<class|sty> {2023/02/15}{4.4.5.5}
+%<class|sty> {2023/02/17}{5.0.0.0}
%<xdufont> {Xidian University Font package}
%<xduugtp> {Xidian University Undergraduate Thesis Proposal class}
%<xdupgthesis> {Xidian University Postgraduate Thesis document class}
@@ -693,7 +693,7 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% 修改\pkgx{biblatex}默认选项,具体配置参考\pkgx{biblatex-gb7714-2015}宏包文档,
% 仅在\optx{style/bib-backend}等于|biblatex|时有效。例如:
% \begin{lstlisting}
-% \xdusetup{ style / biblatex-option = { gbnamefmt=quanpin } }
+% \xdusetup{ style / biblatex-option = { gbnamefmt = quanpin } }
% \end{lstlisting}
% \end{function}
% \subsection{页面配置}
@@ -801,9 +801,10 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \end{optdesc}
% \subsection{算法配置}
% \label{算法配置}
-% \begin{function}[added=2022-06-25]{style/algorithm-small-caption}
+% \changes{v5.0.0.0}{2023/02/17}{精简算法接口名称}
+% \begin{function}[added=2022-06-25,updated=2023-02-17]{style/alg-small-caption}
% \begin{syntax}
-% \opt{style/algorithm-small-caption} = (true)|false
+% \opt{style/alg-small-caption} = (true)|false
% \end{syntax}
% 设置算法caption字号是否为五号。
% \end{function}
@@ -811,9 +812,9 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \item[true] 五号。
% \item[false] 小四号。
% \end{optdesc}
-% \begin{function}[added=2022-04-15]{style/algorithm-small-font}
+% \begin{function}[added=2022-04-15,updated=2023-02-17]{style/alg-small-font}
% \begin{syntax}
-% \opt{style/algorithm-small-font} = (true)|false
+% \opt{style/alg-small-font} = (true)|false
% \end{syntax}
% 设置算法内容字号是否为五号。
% \end{function}
@@ -1053,53 +1054,53 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% cell{4-Z}{1} = {cmd=\texttt},
% rowhead = 3
% }
-% & 开题 & 毕业设计 & & 学位论文 & & & \\
-% & 本科 & 本科 & & 硕士 & & 博士 & \\
-% & & 校内 & 校外 & 学术 & 专业 & 学术 & 专业 \\
-% graduate-type & & & & \cmark & \cmark & \cmark & \cmark \\
-% degree-type & & & & \cmark & \cmark & \cmark & \cmark \\
-% degree & & & & \cmark & \cmark & \cmark & \cmark \\
-% degree* & & & & & \cmark & & \cmark \\
-% title & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% title* & & & & \cmark & \cmark & \cmark & \cmark \\
-% department & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% major & \cmark & \cmark & \cmark & \cmark & & \cmark & \\
-% major* & & & & \cmark & & \cmark & \\
-% sub-major & & & & \cmark & & \cmark & \\
-% domain & & & & & \cmark & & \cmark \\
-% author & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% author* & & & & \cmark & \cmark & \cmark & \cmark \\
-% supervisor & \cmark & \cmark & & \cmark & \cmark & \cmark & \cmark \\
-% supervisor* & & & & \cmark & \cmark & \cmark & \cmark \\
-% supervisor-department & & \cmark & & & & & \\
-% supervisor-enterprise & & & \cmark & & \cmark & & \cmark \\
-% supervisor-enterprise* & & & & & \cmark & & \cmark \\
-% supervisor-school & & & \cmark & & & & \\
-% supervisor-title & & & & \cmark & \cmark & \cmark & \cmark \\
-% supervisor-title* & & & & \cmark & \cmark & \cmark & \cmark \\
-% supervisor-enterprise-title & & & & & \cmark & & \cmark \\
-% supervisor-enterprise-title* & & & & & \cmark & & \cmark \\
-% class & \cmark & & & & & & \\
-% class-id & & \cmark & \cmark & & & & \\
-% student-id & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% clc & & & & \cmark & \cmark & \cmark & \cmark \\
-% secret-level & & & & \cmark & \cmark & \cmark & \cmark \\
-% secret-year & & & & \cmark & \cmark & \cmark & \cmark \\
-% submit-date & \cmark & & & \cmark & \cmark & \cmark & \cmark \\
-% statement-scan & & & & \cmark & \cmark & \cmark & \cmark \\
-% statement-sign & & & & \cmark & \cmark & \cmark & \cmark \\
-% sign & \cmark & & & & & & \\
-% date & \cmark & & & & & & \\
-% abstract & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% abstract* & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% keywords & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% keywords* & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% los & & & & \cmark & \cmark & \cmark & \cmark \\
-% loa & & & & \cmark & \cmark & \cmark & \cmark \\
-% bib-resource & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% appendix & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% acknowledgements & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
-% bio & & & & \cmark & \cmark & \cmark & \cmark \\
+% & 开题 & 毕业设计 & & 学位论文 & & & \\
+% & 本科 & 本科 & & 硕士 & & 博士 & \\
+% & & 校内 & 校外 & 学术 & 专业 & 学术 & 专业 \\
+% graduate-type & & & & \cmark & \cmark & \cmark & \cmark \\
+% degree-type & & & & \cmark & \cmark & \cmark & \cmark \\
+% degree & & & & \cmark & \cmark & \cmark & \cmark \\
+% degree* & & & & & \cmark & & \cmark \\
+% title & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% title* & & & & \cmark & \cmark & \cmark & \cmark \\
+% department & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% major & \cmark & \cmark & \cmark & \cmark & & \cmark & \\
+% major* & & & & \cmark & & \cmark & \\
+% sub-major & & & & \cmark & & \cmark & \\
+% domain & & & & & \cmark & & \cmark \\
+% author & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% author* & & & & \cmark & \cmark & \cmark & \cmark \\
+% supervisor & \cmark & \cmark & & \cmark & \cmark & \cmark & \cmark \\
+% supervisor* & & & & \cmark & \cmark & \cmark & \cmark \\
+% supv-dept & & \cmark & & & & & \\
+% supv-ent & & & \cmark & & \cmark & & \cmark \\
+% supv-ent* & & & & & \cmark & & \cmark \\
+% supv-school & & & \cmark & & & & \\
+% supv-title & & & & \cmark & \cmark & \cmark & \cmark \\
+% supv-title* & & & & \cmark & \cmark & \cmark & \cmark \\
+% supv-ent-title & & & & & \cmark & & \cmark \\
+% supv-ent-title* & & & & & \cmark & & \cmark \\
+% class & \cmark & & & & & & \\
+% class-id & & \cmark & \cmark & & & & \\
+% student-id & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% clc & & & & \cmark & \cmark & \cmark & \cmark \\
+% secret-level & & & & \cmark & \cmark & \cmark & \cmark \\
+% secret-year & & & & \cmark & \cmark & \cmark & \cmark \\
+% submit-date & \cmark & & & \cmark & \cmark & \cmark & \cmark \\
+% statement-scan & & & & \cmark & \cmark & \cmark & \cmark \\
+% statement-sign & & & & \cmark & \cmark & \cmark & \cmark \\
+% sign & \cmark & & & & & & \\
+% date & \cmark & & & & & & \\
+% abstract & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% abstract* & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% keywords & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% keywords* & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% los & & & & \cmark & \cmark & \cmark & \cmark \\
+% loa & & & & \cmark & \cmark & \cmark & \cmark \\
+% bib-resource & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% appendix & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% acknowledgements & & \cmark & \cmark & \cmark & \cmark & \cmark & \cmark \\
+% bio & & & & \cmark & \cmark & \cmark & \cmark \\
% \end{tblr}
% \changes{v1.9.0.0}{2022/05/03}{增加研究生信息录入选项文档}
% \begin{function}[added=2022-05-02,updated=2022-05-03]{info/graduate-type}
@@ -1176,36 +1177,37 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \end{syntax}
% 设置导师姓名。
% \end{function}
-% \begin{function}[added=2022-04-01]{info/supervisor-department}
+% \changes{v5.0.0.0}{2023/02/17}{精简部分信息录入接口名称}
+% \begin{function}[added=2022-04-01,updated=2023-02-17]{info/supv-dept}
% \begin{syntax}
-% \opt{info/supervisor-department} = \meta{院内导师姓名}
+% \opt{info/supv-dept} = \meta{院内导师姓名}
% \end{syntax}
% 设置院内导师姓名。
% \end{function}
-% \begin{function}[added=2022-04-01,updated=2022-05-03]{info/supervisor-enterprise,info/supervisor-enterprise*}
+% \begin{function}[added=2022-04-01,updated=2023-02-17]{info/supv-ent,info/supv-ent*}
% \begin{syntax}
-% \opt{info/supervisor-enterprise} = \meta{校外导师姓名}
-% \opt{info/supervisor-enterprise*} = \meta{校外导师姓名拼音}
+% \opt{info/supv-ent} = \meta{校外导师姓名}
+% \opt{info/supv-ent*} = \meta{校外导师姓名拼音}
% \end{syntax}
% 设置校外导师姓名。
% \end{function}
-% \begin{function}[added=2022-04-01]{info/supervisor-school}
+% \begin{function}[added=2022-04-01,updated=2023-02-17]{info/supv-school}
% \begin{syntax}
-% \opt{info/supervisor-school} = \meta{校内导师姓名}
+% \opt{info/supv-school} = \meta{校内导师姓名}
% \end{syntax}
% 设置校内导师姓名。
% \end{function}
-% \begin{function}[added=2022-05-03]{info/supervisor-title,info/supervisor-title*}
+% \begin{function}[added=2022-05-03,updated=2023-02-17]{info/supv-title,info/supv-title*}
% \begin{syntax}
-% \opt{info/supervisor-title} = \meta{导师职称}
-% \opt{info/supervisor-title*} = \meta{导师职称英文名称}
+% \opt{info/supv-title} = \meta{导师职称}
+% \opt{info/supv-title*} = \meta{导师职称英文名称}
% \end{syntax}
% 设置导师职称。
% \end{function}
-% \begin{function}[added=2022-05-03]{info/supervisor-enterprise-title,info/supervisor-enterprise-title*}
+% \begin{function}[added=2022-05-03,updated=2023-02-17]{info/supv-ent-title,info/supv-ent-title*}
% \begin{syntax}
-% \opt{info/supervisor-enterprise-title} = \meta{校外导师职称}
-% \opt{info/supervisor-enterprise-title*} = \meta{校外导师职称英文名称}
+% \opt{info/supv-ent-title} = \meta{校外导师职称}
+% \opt{info/supv-ent-title*} = \meta{校外导师职称英文名称}
% \end{syntax}
% 设置校外导师职称。
% \end{function}
@@ -1595,20 +1597,20 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \par
% 电子与信息,
% 先进制造
-% \item \optx{supervisor-title}
+% \item \optx{supv-title}
% \par
% 教授,
% 副教授
-% \item \optx{supervisor-title*}
+% \item \optx{supv-title*}
% \par
% Professor,
% Associate Professor
-% \item \optx{supervisor-enterprise-title}
+% \item \optx{supv-ent-title}
% \par
% 研究员,
% 副研究员,
% 高工
-% \item \optx{supervisor-enterprise-title*}
+% \item \optx{supv-ent-title*}
% \par
% Research Fellow,
% Associate Research Fellow,
@@ -1704,7 +1706,7 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% 仅需填写带教导师,无需填写挂名导师。
% 如有特殊需求,需要填写两位老师,
% 可在\optx{info/supervisor}[]、\optx[]{info/supervisor*}[]、^^A
-% \optx[]{info/supervisor-title}和\optx{info/supervisor-title*}中
+% \optx[]{info/supv-title}和\optx{info/supv-title*}中
% 使用逗号分隔两位老师的信息。
% \changes{v2.10.1.1}{2022/06/26}{相似性检测、盲审和抽查评估}
% \subsubsection{相似性检测、盲审和抽查评估}
@@ -2800,6 +2802,7 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \end{macrocode}
% 校外导师姓名。
% \begin{macrocode}
+ supv-ent .tl_set:N = \l_@@_supv_ent_str,
supervisor-enterprise .tl_set:N = \l_@@_supv_ent_str,
% \end{macrocode}
% 作者学号。
@@ -2846,6 +2849,7 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
info / major = { },
info / author = { },
info / supervisor = { },
+ info / supv-ent = { },
info / supervisor-enterprise = { },
info / student-id = { },
info / abstract = { },
@@ -2972,10 +2976,12 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \end{macrocode}
% 院内导师姓名。
% \begin{macrocode}
+ supv-dept .tl_set:N = \l_@@_supv_dept_str,
supervisor-department .tl_set:N = \l_@@_supv_dept_str,
% \end{macrocode}
% 校内导师姓名。
% \begin{macrocode}
+ supv-school .tl_set:N = \l_@@_supv_sch_str,
supervisor-school .tl_set:N = \l_@@_supv_sch_str,
% \end{macrocode}
% 作者班级号。
@@ -2989,7 +2995,9 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \begin{macrocode}
\keys_set:nn { xdu }
{
+ info / supv-dept = { },
info / supervisor-department = { },
+ info / supv-school = { },
info / supervisor-school = { },
info / class-id = { }
}
@@ -3147,16 +3155,21 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \end{macrocode}
% 校外导师姓名拼音。
% \begin{macrocode}
+ supv-ent* .tl_set:N = \l_@@_supv_ent_en_str,
supervisor-enterprise* .tl_set:N = \l_@@_supv_ent_en_str,
% \end{macrocode}
% 导师职称。
% \begin{macrocode}
+ supv-title .clist_set:N = \l_@@_supv_t_clist,
supervisor-title .clist_set:N = \l_@@_supv_t_clist,
+ supv-title* .clist_set:N = \l_@@_supv_t_en_clist,
supervisor-title* .clist_set:N = \l_@@_supv_t_en_clist,
% \end{macrocode}
% 校外导师职称。
% \begin{macrocode}
+ supv-ent-title .tl_set:N = \l_@@_supv_ent_t_str,
supervisor-enterprise-title .tl_set:N = \l_@@_supv_ent_t_str,
+ supv-ent-title* .tl_set:N = \l_@@_supv_ent_t_en_str,
supervisor-enterprise-title* .tl_set:N = \l_@@_supv_ent_t_en_str,
% \end{macrocode}
% 论文标题英文。
@@ -3221,23 +3234,28 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \begin{macrocode}
\keys_set:nn { xdu }
{
- info / graduate-type = { 硕士 },
- info / degree-type = { 学术 },
+ info / graduate-type = 硕士,
+ info / degree-type = 学术,
info / degree = { },
info / degree* = { },
info / author* = { },
info / supervisor* = { },
+ info / supv-ent* = { },
info / supervisor-enterprise* = { },
+ info / supv-title = { },
info / supervisor-title = { },
+ info / supv-title* = { },
info / supervisor-title* = { },
+ info / supv-ent-title = { },
info / supervisor-enterprise-title = { },
+ info / supv-ent-title* = { },
info / supervisor-enterprise-title* = { },
info / title* = { },
info / major* = { },
info / sub-major = { },
info / domain = { },
info / clc = { },
- info / secret-level = { 公开 },
+ info / secret-level = 公开,
info / secret-year = { },
info / submit-date = { },
info / statement-scan = { },
@@ -3325,8 +3343,8 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
\keys_set:nn { xdu }
{
style / remove-page = { },
- style / remove-header = { false },
- style / remove-footer = { false }
+ style / remove-header = false,
+ style / remove-footer = false
}
% \end{macrocode}
% \end{macro}
@@ -3463,7 +3481,7 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \begin{macrocode}
\keys_set:nn { xdu }
{
- style / anonymous = { false }
+ style / anonymous = false
}
% \end{macrocode}
% \end{macro}
@@ -3689,10 +3707,12 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \end{macrocode}
% 设置算法Caption字号是否为五号。
% \begin{macrocode}
+ alg-small-caption .bool_set:N = \l_@@_alg_small_cap_bool,
algorithm-small-caption .bool_set:N = \l_@@_alg_small_cap_bool,
% \end{macrocode}
% 设置算法内容字号是否为五号。
% \begin{macrocode}
+ alg-small-font .bool_set:N = \l_@@_alg_small_bool,
algorithm-small-font .bool_set:N = \l_@@_alg_small_bool,
% \end{macrocode}
% 设置章节标题前的垂直间距。
@@ -3737,19 +3757,21 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
style / fix-include = false,
style / fix-includegraphics = false,
style / ref-add-space = false,
- style / caption-label-sep = { 0.75em },
- style / ft-caption-format = { hang },
- style / alg-caption-format = { hang },
- style / ft-caption-align = { centering-left },
- style / alg-caption-align = { left },
- style / add-alg-rule-vspace = { false },
+ style / caption-label-sep = 0.75em,
+ style / ft-caption-format = hang,
+ style / alg-caption-format = hang,
+ style / ft-caption-align = centering-left,
+ style / alg-caption-align = left,
+ style / add-alg-rule-vspace = false,
style / table-small-font = true,
+ style / alg-small-caption = true,
style / algorithm-small-caption = true,
+ style / alg-small-font = true,
style / algorithm-small-font = true,
style / before-skip = { 24pt, 18pt, 12pt, 12pt, 12pt, 12pt },
style / after-skip = { 18pt, 12pt, 6pt, 6pt, 6pt, 6pt },
style / symmetric-margin = false,
- style / page-vertical-align = { 顶部对齐 }
+ style / page-vertical-align = 顶部对齐
}
% \end{macrocode}
% \end{macro}
@@ -3846,12 +3868,12 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \begin{macrocode}
\keys_set:nn { xdu }
{
- style / customize-los = { true },
- style / customize-loa = { true },
- style / colspec-los = { Q[l,h]X[l,h] },
+ style / customize-los = true,
+ style / customize-loa = true,
+ style / colspec-los = { Q[l,h]X[l,h] },
style / colspec-loa = { Q[l,h]X[l,h]X[l,h] },
- style / title-row-los = { false },
- style / title-row-loa = { false }
+ style / title-row-los = false,
+ style / title-row-loa = false
}
% \end{macrocode}
% \end{macro}
@@ -3892,8 +3914,8 @@ literate = {\$}{{\textcolor{purple3}{\$}}}{1}
% \begin{macrocode}
\keys_set:nn { xdu }
{
- style / customize-edubg = { true },
- style / customize-resresult = { true }
+ style / customize-edubg = true,
+ style / customize-resresult = true
}
% \end{macrocode}
% \end{macro}
diff --git a/macros/xetex/latex/xduts/xduts.pdf b/macros/xetex/latex/xduts/xduts.pdf
index 9e96f92cc5..e945d5fe18 100644
--- a/macros/xetex/latex/xduts/xduts.pdf
+++ b/macros/xetex/latex/xduts/xduts.pdf
Binary files differ
diff --git a/macros/generic/soul/Makefile b/obsolete/macros/generic/soul/Makefile
index 1a0103f695..1a0103f695 100644
--- a/macros/generic/soul/Makefile
+++ b/obsolete/macros/generic/soul/Makefile
diff --git a/obsolete/macros/generic/soul/soul.dtx b/obsolete/macros/generic/soul/soul.dtx
new file mode 100644
index 0000000000..064634cf11
--- /dev/null
+++ b/obsolete/macros/generic/soul/soul.dtx
@@ -0,0 +1,4520 @@
+% \iffalse
+%% File: soul.dtx Copyright (C) 1998--2003 Melchior FRANZ
+%% $Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel $
+%% $Version: 2.4 $
+%
+%<*batchfile>
+%
+% on Unix/Linux just run "make" to get the style file and the documentation,
+% else generate the driver soul.ins (if you don't already have it):
+%
+% $ latex soul.dtx
+%
+% You'll probably get an error message that you may ignore. Now generate
+% the style file:
+%
+% $ tex soul.ins
+%
+% And finally to produce the documentation run LaTeX three times:
+%
+% $ latex soul.dtx
+%
+%
+%
+%
+% DISCLAIMER: note that a Makefile could actually contain malign commands
+% that erase your whole account, so having a look at it before won't hurt!
+% I take no responsibility for any damage, but I do what I can to make
+% using the original Makefile safe.
+%
+% COPYRIGHT NOTICE:
+% This package is free software that can be redistributed and/or modified
+% under the terms of the LaTeX Project Public License as specified
+% in the file macros/latex/base/lppl.txt on any CTAN archive server,
+% such as ftp://ftp.dante.de/.
+%
+%$
+%% ====================================================================
+%% @LaTeX-package-file{
+%% author = "Melchior FRANZ",
+%% version = "2.4",
+%% date = "17 November 2003",
+%% filename = "soul.dtx",
+%% address = "Melchior FRANZ
+%% Rieder Hauptstrasse 52
+%% A-5212 SCHNEEGATTERN
+%% AUSTRIA",
+%% telephone = "++43 7746 3109",
+%% URL = "http://www.unet.univie.ac.at/~a8603365/",
+%% email = "a8603365@unet.univie.ac.at",
+%% codetable = "ISO/ASCII",
+%% keywords = "spacing out, letterspacing, underlining, striking out,
+%% highlighting",
+%% supported = "yes",
+%% docstring = "This article describes the `soul' package, which
+%% provides hyphenatable letterspacing (spacing out),
+%% underlining, and some derivatives.
+%% All features are based upon a common mechanism
+%% that allows to typeset text syllable by syllable,
+%% where the excellent TeX hyphenation algorithm is
+%% used to find the proper hyphenation points.
+%% Two examples show how to use the provided interface to
+%% implement things such as `an-a-lyz-ing syl-la-bles'.
+%% Although the package is optimized for LaTeX2e,
+%% it works with Plain TeX and with other
+%% packages, too.",
+%% }
+%% ====================================================================
+%
+%
+%
+%
+%
+\begin{filecontents}{soul.ins}
+\def\batchfile{soul.ins}
+\input docstrip.tex
+\askforoverwritefalse
+\keepsilent % <-- this is for you, Christina ;-)
+\generate{\file{soul.sty}{\from{soul.dtx}{package}}}
+\endbatchfile
+\end{filecontents}
+%</batchfile>
+%
+%
+%
+%
+%
+%<*driver>
+\def\fileversion{2.4}
+\def\filedate{2003/11/17}
+%
+%
+%
+\documentclass{ltxdoc}
+%
+%
+%
+\makeatletter\let\SOUL@sethyphenchar\relax\makeatother
+\IfFileExists{soul.sty}{%
+ \usepackage{soul}[2002/01/10]
+ \expandafter\ifx\csname sloppyword\endcsname\relax % old version?
+ \def\sloppyword{\textbf{?? [obsolete soul version]}}
+ \fi
+ \let\SOULSTYfound\active
+}{%
+ \GenericWarning{soul.dtx}{%
+ Package file `soul.sty' couldn't be found. You should however find^^J^^A
+ a file `soul.ins' in the current directory. If you type "tex soul.ins"^^J^^A
+ on the command line, `soul.sty' will be generated. After that
+ run "latex soul.dtx" again and you won't see this message again.
+ }%
+}%
+%
+%
+%
+\ifx\makehyperref\SOULundefined
+ \newcommand*\texorpdfstring[2]{#1}
+\else ^^A for "make hyper"
+ \usepackage{hyperref}
+ \hypersetup{
+ bookmarksopen,
+ colorlinks,
+ pdftitle={The soul package},
+ pdfauthor={Melchior FRANZ},
+ pdfsubject={${}$Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel ${}$},
+ pdfkeywords={space out, letterspacing, underlining, overstriking, highlighting}
+ }
+ \usepackage[pdftex]{graphicx,color}
+\fi
+%
+%
+%
+%\RecordChanges
+%
+\begin{document}
+\setcounter{tocdepth}{2}
+\DocInput{soul.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+%
+%
+%
+%
+%
+%
+% \CheckSum{2006}
+% \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 \~}
+%
+%
+%
+% \title{The \texttt{soul} package}
+%
+% \author{Melchior \caps{FRANZ}}
+%
+% \date{November 17, 2003}
+%
+%^^A=====================================================
+%
+%^^A These messy macros allow to typeset the `example' sections
+%^^A conveniently. You'd better ignore them. I do! :-)
+%
+% \makeatletter
+%
+% \def\squarebull{\rule[.2ex]{.8ex}{.8ex}}
+%
+% \newenvironment{examples}
+% {\parindent\z@\small\fontencoding{OT1}\selectfont}
+% {\rule{\hsize}{.4pt}}
+%
+% \def\soultest#1|{\bgroup\rule[.5ex]{\hsize}{.4pt}\par
+% \parbox[t]{.34\hsize}{\raggedright\textit{#1\unskip.}}%
+% \hspace{1.5em}$\vtop\bgroup\hb@xt@.4\hsize\bgroup
+% \llap{\squarebull\hspace{.4em}}\soulttest}
+%
+% {\catcode`\|=13\gdef\soulttest{%
+% \bgroup\def\do##1{\catcode`##1=12}\dospecials\ttfamily
+% \catcode`\|=13\unskip\def|{\hss\egroup\egroup\soultttest}}}
+%
+% \def\soultttest#1{\hbox{\vtop{\hsize.4\hsize\hbadness\@M
+% \leavevmode\llap{\squarebull\hspace{.4em}}#1\null}}%
+% \egroup$\hspace{1.5em}\parbox[t]{1mm}{\hyphenpenalty-\@M
+% \exhyphenpenalty-\@M\hbadness\@M\hfuzz\maxdimen
+% \strut\llap{\squarebull\hspace{.4em}}#1\null}%
+% \goodbreak\vspace{2ex}
+% \egroup}
+%
+% \newcommand*\DescribeOption[1]{\marginpar{\raggedleft\textsf{#1}\ignorespaces}}
+%
+%
+%^^A similar to the `description' environment
+%
+% \def\describemacro{^^A
+% \bgroup
+% \let\do\@makeother
+% \dospecials
+% \catcode`{=1
+% \catcode`}=2
+% \SOUL@@@descmacro
+% }
+%
+% \def\SOUL@@@descmacro#1{^^A
+% \texttt{#1}^^A
+% \DescribeMacro{#1}^^A
+% \expandafter\edef\expandafter\x\expandafter{\expandafter\@gobble#1}^^A
+% \expandafter\label{cmd:\x}^^A
+% \egroup
+% }
+%
+%
+% \def\SOUL@@@verbitem[#1: {^^A
+% \bgroup
+% \let\do\@makeother
+% \dospecials
+% \SOUL@@@verbscan{#1}^^A
+% }
+%
+% \def\SOUL@@@verbscan#1#2]{^^A
+% \egroup
+% \goodbreak
+% \def\@currentlabel{\S\,\the\SOUL@@@itemnr}^^A
+% \label{par:#1}^^A
+% \SOUL@@@item[\textbf{\@currentlabel\hskip.6em#1:}]\hfil\break
+% Example: \texttt{#2}\hfil\break^^A
+% \advance\SOUL@@@itemnr1
+% }
+%
+% \let\SOUL@@@item\item
+% \newcount\SOUL@@@itemnr
+%
+% \newenvironment{verblist}[1]{^^A
+% \SOUL@@@itemnr=#1
+% \list{}{^^A
+% \settowidth{\labelwidth}{\indent\indent}^^A
+% \leftmargin\labelwidth
+% \advance\leftmargin\labelsep
+% \def\makelabel##1{##1}^^A
+% \let\item\SOUL@@@verbitem
+% }^^A
+% }{^^A
+% \endlist
+% }
+%
+% \newenvironment{labeling}[1]{^^A
+% \list{}{^^A
+% \settowidth{\labelwidth}{\textbf{#1}}^^A
+% \leftmargin\labelwidth\advance\leftmargin\labelsep
+% \def\makelabel##1{\textbf{##1}\hfil}^^A
+% }^^A
+% }{^^A
+% \endlist
+% }
+%
+% \newenvironment{syntax}{^^A
+% \par\medskip\def\<##1>{$\langle$\syn{##1}$\rangle$}^^A
+% \indent\begin{tabular}{l}^^A
+% }{^^A
+% \end{tabular}^^A
+% \noindentafter\medbreak
+% }
+%
+%
+% \newenvironment{example}[1][.9\textwidth]
+% {\par\medskip\indent\begin{tabular}{p{#1}l}}
+% {\end{tabular}\noindentafter\medbreak}
+%
+% \newcommand*\noindentafter{^^A
+% \global\everypar{{\setbox\z@\lastbox}\everypar{}}}
+%
+% \newcommand*\errsquare{\leavevmode\vrule height.8em depth.2em width1em\relax}
+%
+%
+% \ifx\SOULSTYfound\active
+%^^A analyze syllables---described somewhere below
+%
+% \DeclareRobustCommand*\sy{^^A
+% \SOUL@setup
+% \def\SOUL@preamble{\lefthyphenmin0\righthyphenmin0}^^A
+% \def\SOUL@everysyllable{\the\SOUL@syllable}^^A
+% \def\SOUL@everyspace##1{##1\space}^^A
+% \def\SOUL@everyhyphen{^^A
+% \discretionary{^^A
+% \SOUL@setkern\SOUL@hyphkern
+% \SOUL@sethyphenchar
+% }{}{^^A
+% \hbox{\kern1pt$\cdot$}^^A
+% }^^A
+% }^^A
+% \def\SOUL@everyexhyphen##1{^^A
+% \SOUL@setkern\SOUL@hyphkern
+% \hbox{##1}^^A
+% \discretionary{}{}{^^A
+% \SOUL@setkern\SOUL@charkern
+% }^^A
+% }^^A
+% \SOUL@}
+%
+%^^A analyze the engine---described somewhere below, too
+%
+% \DeclareRobustCommand*\an{^^A
+% \def\SOUL@preamble{$^{^P}$}^^A
+% \def\SOUL@everyspace##1{##1\texttt{\char`\ }}^^A
+% \def\SOUL@postamble{$^{^E}$}^^A
+% \def\SOUL@everyhyphen{$^{^-}$}^^A
+% \def\SOUL@everyexhyphen##1{##1$^{^=}$}^^A
+% \def\SOUL@everysyllable{$^{^S}$}^^A
+% \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}^^A
+% \def\SOUL@everylowerthan{$^{^L}$}^^A
+% \SOUL@}
+%
+%^^A magazine-like (truly awful) paragraphs
+%^^A If you know what you're doing, you can copy it to your personal `soul.cfg' file.
+%
+% \DeclareRobustCommand*\magstylepar{\SOUL@sosetup
+% \def\SOUL@preamble{^^A
+% \edef\SOUL@soletterskip{\z@\@plus\fontdimen2\font\@minus\z@}^^A
+% \edef\SOUL@soinnerskip{\the\fontdimen2\font
+% \@plus\the\fontdimen3\font\@minus\the\fontdimen4\font}^^A
+% \let\SOUL@soouterskip\SOUL@soinnerskip
+% \SOUL@sopreamble}^^A
+% \lefthyphenmin2\righthyphenmin2\SOUL@}
+%
+%\else
+%
+%^^A The package has not been found, so we're providing some dummies, just
+%^^A to avoid all these `Undefined command sequence' messages.
+%
+% \def\SOUL@@@X#1{\textbf{??}}%
+% \let\so\SOUL@@@X
+% \let\textso\SOUL@@@X
+% \let\caps\SOUL@@@X
+% \let\textcaps\SOUL@@@X
+% \let\ul\SOUL@@@X
+% \let\textul\SOUL@@@X
+% \let\st\SOUL@@@X
+% \let\textst\SOUL@@@X
+% \let\hl\SOUL@@@X
+% \let\texthl\SOUL@@@X
+% \let\sy\SOUL@@@X
+% \let\an\SOUL@@@X
+% \let\magstylepar\SOUL@@@X
+% \let\sloppyword\SOUL@@@X
+% \def\sodef#1#2#3#4{\let#1\relax\SOUL@@@X}%
+% \fi
+%
+% \newcommand*\xpath{^^A
+% \bgroup
+% \let\do\@makeother
+% \dospecials
+% \catcode`\{=1
+% \catcode`\}=2
+% \def\{{\char"7B}^^A
+% \def\}{\char"7D}^^A
+% \SOUL@@@code
+% }
+%
+% \newcommand*\SOUL@@@code[1]{\normalfont\texttt{#1}\egroup}
+%
+% \let\cs\xpath
+% \let\option\textsf
+% \def\package#1{{\normalfont\texttt{#1}}}
+% \let\program\texttt
+% \let\bibtitle\textit
+% \let\syn\textit
+%
+% \sodef\person{\scshape}{0.06em}{0.45em}{0.4em}
+% \sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}
+% \DeclareRobustCommand*\versal[1]{^^A
+% \MakeUppercase{\SOUL@@@versal{#1}}^^A
+% }
+%
+% \def\ConTeXt{Con\TeX t}
+% \def\CTAN{{\small\caps{CTAN}}}
+% \def\soul{\package{soul}}
+%
+% ^^A set some parameters as used in Plain TeX
+% \def\plainsetup{^^A
+% \pretolerance100
+% \tolerance200
+% \hbadness1000
+% \linepenalty10
+% \hyphenpenalty50
+% \exhyphenpenalty50
+% \doublehyphendemerits10000
+% \finalhyphendemerits5000
+% \adjdemerits10000
+% \hfuzz.1pt
+% \overfullrule5pt
+% }
+%
+% \def\FIXME#1{\message{<FIXME>}#1}
+%
+% \makeatother
+%
+%
+% \lefthyphenmin2
+% \righthyphenmin3
+% \hyphenation{Le-se-ty-po-gra-phie Ver-bin-dung fak-si-mi-le}
+%
+%
+%^^A=====================================================
+%
+%
+% \changes{v1.0}{1998/10/16}{Initial version}%
+%^^A due to an error in the documentation of v1.0, there's no v1.1 :-(
+% \changes{v1.1a}{1998/12/08}{fixed a bunch of bugs; `magstylepar command
+% banned; `caps introduced; `so and `caps recognize following spaces;
+% error message added; `so parameters are mandatory}
+%
+% \changes{v1.2}{1999/01/11}{fixed the newline bug; added the `\(>\) command}
+%
+% \changes{v1.3}{1999/05/15}{changed allowhyphen, preambles; added a paragraph
+% in the `features' section}
+%
+% \changes{v2.0}{2002/01/03}{(almost) complete rewrite}
+%
+% \changes{v2.1}{2002/01/10}{Happy (64th) birthday, Don!
+% ``The now-traditional fix for the
+% now-traditional brown-paper-bag major release.''
+% as Eric S. RAYMOND commented on his CML2.0.1 release. ;-)}
+%
+% \changes{v2.2}{2002/05/12}{fixed a couple of bugs; added support for
+% the Plain TeX color.sty wrapper}
+%
+% \changes{v2.3}{2002/05/29}{compatibility with cmbright/ccfonts}
+%
+% \changes{v2.4}{2003/11/17}{Fix the font bug. Fix a scanner bug.
+% Other bugfixes; change caps set handling; add footnote and
+% textsuperscript support}
+%
+%
+%
+%
+%
+% \maketitle
+%
+%
+%
+% \begin{abstract}
+% This article describes the \soul\ package^^A
+%^^A%%
+% \footnote{This file has version number \fileversion, last revised \filedate.},
+%^^A%%
+% which provides \so{hyphenatable letterspacing (spacing out),} \ul{underlining}
+% and some derivatives such as \st{overstriking} and highlighting.
+% Although the package is optimized for \LaTeXe, it also works with
+% Plain \TeX\ and with other flavors of \TeX\ like, for instance, \ConTeXt.
+% By the way, the package name |soul| is only a combination
+% of the two macro names \cs{\so} (space out) and \cs{\ul}
+% (underline)---nothing poetic at all.^^A :-(
+% \end{abstract}
+%
+%
+% {\setlength\parskip{0pt}\tableofcontents }
+% \addtocontents{toc}{\protect\begin{multicols}{2}}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Typesetting rules}
+% \label{sec:typesetting}
+%
+% There are several possibilities to emphasize parts of a paragraph,
+% not all of which are considered good style. While underlining
+% is commonly rejected, experts dispute about whether letterspacing
+% should be used or not, and in which cases. If you are not interested
+% in such debates, you may well skip to the next section.
+%
+%
+% \subsection*{Theory \dots}
+% \label{sec:theory}
+%
+% To understand the experts' arguments we have to know about the
+% conception of \emph{page grayness.} The sum of all characters on
+% a page represents a certain amount of grayness, provided that
+% the letters are printed black onto white paper.
+%
+% \person{Jan Tschichold} \cite{Tschichold}, a well known and recognized
+% typographer, accepts only forms of emphasizing, which do not disturb this
+% grayness. This is only true of italic shape, caps, and
+% caps-and-small-caps fonts, but not of ordinary letterspacing, underlining,
+% bold face type and so on, all of which appear as either dark or light
+% spots in the text area. In his opinion emphasized text shall not catch the eye when
+% running over the text, but rather when actually reading the respective words.
+%
+% Other, less restrictive typographers \cite{Willberg} call this kind of emphasizing
+% `integrated' or `aesthetic', while they describe `active' emphasizing apart from it,
+% which actually \emph{has} to catch the reader's eye. To the latter group belong commonly
+% despised things like letterspacing, demibold face type and even underlined and colored text.
+%
+% On the other hand, \person{Tschichold} suggests
+% to space out caps and caps-and-small-caps fonts on title pages, headings and running headers from
+% 1\,pt up to 2\,pt.
+% Even in running text legibility of uppercase letters should be improved with slight
+% letterspacing, since (the Roman) majuscules don't look right, if they are spaced
+% like (the Carolingian) minuscules.\footnote{This suggestion is followed throughout this article,
+% although Prof.~\person{Knuth} already considered slight letterspacing with his |cmcsc| fonts.}
+%
+%
+%
+%\subsection*{\dots\ and Practice}
+%
+% However, in the last centuries letterspacing was excessively used,
+% underlining at least sometimes, because capitals and italic shape could
+% not be used together with the \emph{Fraktur} font and other black-letter fonts,
+% which are sometimes also called ``old German'' fonts.
+% This tradition is widely continued until today. The same limitations apply still today
+% to many languages with non-latin glyphs, which is why letterspacing has a strong
+% tradition in eastern countries where Cyrillic fonts are used.
+%
+% The \person{Duden} \cite{Duden}, a well known German dictionary, explains how to space out properly:
+% \emph{Punctuation marks are spaced out like letters, except quotation marks and periods.
+% Numbers are never spaced out. The German syllable \mbox{\emph{-sche}} is not spaced
+% out in cases like \emph{``der {\so{Virchow{sche}}} Versuch''}\footnote{the \person{Virchow} experiment}.
+% In the old German \emph{Fraktur} fonts the ligatures \emph{|ch|, |ck|, |sz|~(\ss)} and~\emph{|tz|} are
+% not broken within spaced out text.}
+%
+% While some books follow all these rules \cite{Muszynski}, others don't
+% \cite{Reglement}. In fact, most books in my personal library do \emph{not} space out commas.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Short introduction and common rules}
+%
+% The \soul\ package provides five commands that are aimed at emphasizing
+% text parts. Each of the commands takes one argument that can either be
+% the text itself or the name of a macro that contains text (e.\,g.~|\so\text|)^^A
+% ^^A
+% \footnote{See~\ref{par:Unexpandable material in command sequences} for
+% some additional information about the latter mode.}^^A
+% ^^A
+% .
+% See table~\ref{tab:survey} for a complete command survey.
+%
+% {\catcode`\|=12
+% \begin{center}
+% \begin{tabular}{r@{\hspace{1.5em}}l}
+% \verb+\so{letterspacing}+&\so{letterspacing}\\
+% \verb+\caps{CAPITALS, Small Capitals}+&\caps{CAPITALS, Small Capitals}\\
+% \verb+\ul{underlining}+&\ul{underlining}\\
+% \verb+\st{overstriking}+&\st{overstriking}\\
+% \verb+\hl{highlighting}+&highlighting\footnotemark\\
+% \end{tabular}
+% \end{center}
+% \footnotetext{The look of highlighting is nowhere demonstrated
+% in this documentation, because it requires a Postscript aware
+% output driver and would come out as ugly black bars on other
+% devices, looking very much like censoring bars. Think of it as
+% the effect of one of those coloring text markers.}
+% }
+%
+% \noindent
+% The \cs{\hl} command does only highlight if the \package{color} package
+% was loaded, otherwise it falls back to underlining.\footnote{Note that
+% you can also use \LaTeX's \package{color} package with Plain \TeX.
+% See~\ref{sec:plain} for details.} The highlighting
+% color is by default yellow, underlines and overstriking lines are by
+% default black. The colors can be changed using the following commands:
+%
+% {\catcode`\|=12
+% \begin{center}
+% \begin{tabular}{r@{\hspace{1.5em}}l}
+% \verb+\setulcolor{red}+&set underlining color\\
+% \verb+\setstcolor{green}+&set overstriking color\\
+% \verb+\sethlcolor{blue}+&set highlighting color\\
+% \end{tabular}
+% \end{center}
+% }
+%
+% \noindent
+% |\setulcolor{}| and |\setstcolor{}| turn coloring off.
+% There are only few colors predefined by the \package{color}
+% package, but you can easily add custom color definitions.
+% See the \package{color} package documentation~\cite{color} for further
+% information.
+%
+% \begin{example}
+% |\usepackage{color,soul}|\\
+% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
+% |\sethlcolor{lightblue}|\\
+% |...|\\
+% |\hl{this is highlighted in light blue color}|\\
+% \end{example}
+%
+%
+%
+%
+%
+%
+%
+% \subsection[Some things work]{Some things work \dots}
+%
+% The following examples may look boring and redundant, because they describe
+% nothing else than common \LaTeX\ notation with a few exceptions, but this is
+% only the half story: The \soul\ package has to pre-process the argument
+% before it can split it into characters and syllables, and all described
+% constructs are only allowed because the package explicitly implements them.
+%
+% \begin{verblist}{1}
+% \item[Accents: \so{na\"\i ve}]
+% Accents can be used naturally.
+% Support for the following accents is built-in: |\`|, |\'|, |\^|, |\"|, |\~|,
+% |\=|, |\.|, |\u|, |\v|, |\H|, |\t|, |\c|, |\d|, |\b|, and |\r|. Additionally,
+% if the \package{german} package \cite{german} is loaded you can also use the |"|
+% accent command and write |\so{na"ive}|. See section~\ref{sec:soulaccent} for how to add
+% further accents.
+% \item[Quotes: \so{``quotes''}]
+% The \soul\ package recognizes the quotes ligatures |``|, |''| and |,,|.
+% The Spanish ligatures |!`| and |?`| are not recognized and have, thus,
+% to be written enclosed in braces like in |\caps{{!`}Hola!}|.
+% \item[Mathematics: \so{foo$x^3$bar}]
+% Mathematic formulas are allowed, as long as they are
+% surrounded by~\texttt\$. Note that the \LaTeX\
+% equivalent |\(...\)| does not work.
+% \item[Hyphens and dashes: \so{re-sent}]
+% Explicit hyphens as well as en-dashes~(|--|), em-dashes~(|---|)
+% and the |\slash| command work as usual.
+% \item[Newlines: \so{new\\line}]
+% The |\\|~command fills the current line with white space
+% and starts a new line. Spaces or linebreaks afterwards are ignored.
+% Unlike the original \LaTeX\ command \soul's version does not handle
+% optional parameters like in |\\*[1ex]|.
+% \item[Breaking lines: \so{foo\linebreak bar}]
+% The \cs{\linebreak} command breaks the line without
+% filling it with white space at the end. \soul's version
+% does not handle optional parameters like in |\linebreak[1]|.
+% \cs{\break} can be used as a synonym.
+% \item[Unbreakable spaces: \so{don't~break}]
+% The |~|~command sets an unbreakable space.
+% \item[Grouping: \so{Virchow{sche}}]
+% A pair of braces can be used to let a group of characters
+% be seen as one entity, so that \soul\ does
+% for instance not space it out. The contents must, however,
+% not contain potential hyphenation points. (See~\ref{par:Protecting})
+% \item[Protecting: \so{foo \mbox{little} bar}]
+% An \cs{\mbox} also lets \soul\ see the contents as one
+% item, but these may even contain hyphenation points. \cs{\hbox} can
+% be used as a synonym.
+% \item[Omitting: \so{\soulomit{foo}}]
+% The contents of \cs{\soulomit} bypass the soul core and are typeset
+% as is, without being letterspaced or underlined. Hyphenation points are
+% allowed within the argument. The current font remains active, but can be
+% overridden with \cs{\normalfont} etc.
+% \item[Font switching commands: \so{foo \texttt{bar}}]
+% All standard \TeX\ and \LaTeX\ font switching commands are allowed, as
+% well as the \package{yfonts} package \cite{yfonts} font commands like \cs{\textfrak} etc.
+% Further commands have to be registered using the \cs{\soulregister}
+% command (see section~\ref{sec:soulregister}).
+% \item[Breaking up ligatures: \ul{Auf{}lage}]
+% Use |{}| or \cs{\null} to break up ligatures like `fl' in \cs{\ul}, \cs{\st} and \cs{\hl}
+% arguments.
+% This doesn't make sense for \cs{\so} and \cs{\caps}, though, because they break up
+% every unprotected (ungrouped\slash unboxed) ligature, anyway, and would
+% then just add undesirable extra space around the additional item.
+% \end{verblist}
+%
+%
+%
+%
+% \subsection{\texorpdfstring{\dots\ }{... }others don't}
+%
+% Although the new \soul\ is much more robust and forgiving than
+% versions prior to~2.0, there are
+% still some things that are not allowed in arguments.
+% This is due to the complex engine, which has to read and inspect every
+% character before it can hand it over to \TeX's paragraph builder.
+%
+% \begin{verblist}{20}
+% \item[Grouping hyphenatable material: \so{foo {little} bar}]
+% Grouped characters must not contain hyphenation points. Instead of
+% |\so{foo {little}}| write |\so{foo \mbox{little}}|. You get a
+% \texttt{`Re\-con\-struction failed'} error and a black square like
+% \errsquare\ in the \caps{DVI} file where you violated this rule.
+% \item[Discretionary hyphens: \so{Zu\discretionary{k-}{}{c}ker}]
+% The argument must not contain discretionary hyphens. Thus, you have to
+% handle cases like the German word |Zu\discretionary{k-}{}{c}ker| by yourself.
+% \item[Nested soul commands: \ul{foo \so{bar} baz}]
+% \soul\ commands must not be nested. If you really
+% need such, put the inner stuff in a box and use this box. It will, of
+% course, not get broken then.\\
+% \null\qquad|\newbox\anyboxname|\\
+% \null\qquad|\sbox\anyboxname{ \so{the worst} }|\\
+% \null\qquad|\ul{This is by far{\usebox\anyboxname}example!}|\\
+% yields:\\
+% \newbox\anyboxname
+% \sbox\anyboxname{ \so{the worst} }
+% \null\qquad\ul{This is by far{\usebox\anyboxname}example!}
+% \item[Leaking font switches: \def\foo{\bf bar} \so{\foo baz}]
+% A hidden font switching command that leaks into its neighborship
+% causes a \texttt{`Reconstruction failed'} error. To avoid this either
+% register the `container' (|\soulregister{\foo}{0}|), or limit its
+% scope as in |\def\foo{{\bf bar}}|. Note that both
+% solutions yield slightly different results.
+% \item[Material that needs expansion: \so{\romannumeral\year}]
+% In this example \cs{\so} would try to put space between \cs{\romannumeral}
+% and \cs{\year}, which can, of course, not work.
+% You have to expand the argument before you feed it to \soul, or even better:
+% Wrap the material up in a command sequence and let \soul\ expand it:
+% |\def\x{\romannumeral\year}| |\so\x|. \soul\ tries hard to expand
+% enough, yet not too much.
+% \item[Unexpandable material in command sequences: \def\foo{\bar} \so\foo]
+% Some macros might not be expandable in an \cs{\edef} definition^^A
+% \footnote{Try \texttt{\string\edef\string\x\char`\{\string\copyright\char`\}}.
+% Yet \texttt{\string\copyright} works in \soul\ arguments, because it is
+% explicitly taken care of by the package}
+% and have to be protected with \cs{\noexpand} in front. This is automatically done
+% for the following tokens: |~|, \cs{\,}, \cs{\TeX}, \cs{\LaTeX},
+% \cs{\S}, \cs{\slash}, \cs{\textregistered}, \cs{\textcircled}, and \cs{\copyright},
+% as well as for all registered fonts and accents. Instead of putting \cs{\noexpand}
+% manually in front of such commands, as in |\def\foo{foo {\noexpand\bar} bar}| |\so\foo|,
+% you can also register them as special (see section \ref{sec:soulregister}).
+% \item[Other weird stuff: \so{foo \verb|\bar| baz}]
+% \soul\ arguments must not contain \LaTeX\ environments, command definitions,
+% and fancy stuff like |\vadjust|. \soul's |\footnote| command replacement
+% does not support optional arguments. As long as you are writing simple,
+% ordinary `horizontal' material, you are on the safe side.
+% \end{verblist}
+%
+%
+%
+%
+%
+%
+%
+% \begin{table}
+% \begin{center}
+% \catcode`\|=12
+% \newcommand*\pref[1]{{\footnotesize\pageref{cmd:#1}}}
+% \newcommand*\Ast{\rlap{$^\ast$}}
+% \let\m\cs
+% \let\ti\textit
+% \begin{tabular}{r@{\hspace{.6em}}c@{\hspace{.6em}}l}
+% &\hbox to0pt{\hss\footnotesize page\hss}&\\[.5ex]
+% \verb+\so{letterspacing}+& \pref{so} &\so{letterspacing}\\
+% \verb+\caps{CAPITALS, Small Capitals}+& \pref{caps} &\caps{CAPITALS, Small Capitals}\\
+% \verb+\ul{underlining}+& \pref{ul} &\ul{underlining}\\
+% \verb+\st{striking out}+& \pref{st} &\st{striking out}\\
+% \verb+\hl{highlighting}+& \pref{hl} &highlighting\\
+% \\
+% \verb+\soulaccent{\cs}+& \pref{soulaccent} &\ti{add accent} \cs{\cs} \ti{to accent list}\\
+% \verb+\soulregister{\cs}{0}+& \pref{soulregister} &\ti{register command} \m{\cs}\\
+% \verb+\sloppyword{text}+& \pref{sloppyword} &\ti{typeset} \m{text} \ti{with stretchable spaces}\\
+% \\
+% \verb+\sodef\cs{1em}{2em}{3em}+& \pref{sodef} &\ti{define new spacing command} \m{\cs}\\
+% \verb+\resetso+& \pref{resetso} &\ti{reset} \m{\so} \ti{dimensions}\\
+% \verb+\capsdef{////}{1em}{2em}{3em}+\Ast& \pref{capsdef} &\ti{define (default)} \m{\caps} \ti{data entry}\\
+% \verb+\capssave{name}+\Ast& \pref{capssave} &\ti{save} \m{\caps} \ti{database under name} \rlap{\texttt{name}}\\
+% \verb+\capsselect{name}+\Ast& \pref{capssave} &\ti{restore} \m{\caps} \ti{database of name} \rlap{\texttt{name}}\\
+% \verb+\capsreset+\Ast& \pref{capsreset} &\ti{clear caps database}\\
+% \verb+\setul{1ex}{2ex}+& \pref{setul} &\ti{set} \m{\ul} \ti{dimensions}\\
+% \verb+\resetul+& \pref{resetul} &\ti{reset} \m{\ul} \ti{dimensions}\\
+% \verb+\setuldepth{y}+& \pref{setuldepth} &\ti{set underline depth to depth of an} y\\
+% \verb+\setuloverlap{1pt}+& \pref{setuloverlap} &\ti{set underline overlap width}\\
+% \verb+\setulcolor{red}+& \pref{setulcolor} &\ti{set underline color}\\
+% \verb+\setstcolor{green}+& \pref{setstcolor} &\ti{set overstriking color}\\
+% \verb+\sethlcolor{blue}+& \pref{sethlcolor} &\ti{set highlighting color}\\
+% \end{tabular}
+% \caption{List of all available commands. The number points to the
+% page where the command is described. Those marked
+% with a little asterisk are only available when the package
+% is used together with \LaTeX, because they rely on the
+% \emph{New Font Selection Scheme (NFSS)} used in \LaTeX.}
+% \label{tab:survey}
+% \end{center}
+% \end{table}
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Troubleshooting}
+%
+% Unfortunately, there's just one helpful error message provided by
+% the \soul\ package, that actually describes the underlying problem. All other
+% messages are generated directly by \TeX\ and show the low-level
+% commands that \TeX\ wasn't happy with. They'll hardly point you
+% to the violated rule as described in the paragraphs above.
+% If you get such a mysterious error message for a line that contains
+% a \soul\ statement, then comment that statement out and see if the message
+% still appears.
+% \texttt{`Incomplete }\cs{\ifcat}\texttt{'} is such a non-obvious message.
+% If the message doesn't appear now, then check the argument for
+% violations of the rules as listed in~\S\S\,20--26.
+%
+%
+%
+% \subsubsection{\texttt{`Reconstruction failed'}}
+%
+% This message appears, if \ref{par:Grouping hyphenatable material} or
+% \ref{par:Leaking font switches} was
+% violated. It is caused by the fact that the reconstruction pass
+% couldn't collect tokens with an overall width of the syllable that
+% was measured by the analyzer. This does either occur when you
+% grouped hyphenatable text or used an unregistered command
+% that influences the syllable width. Font switching commands belong
+% to the latter group. See the above cited sections for how to fix
+% these problems.
+%
+%
+%
+% \subsubsection{Missing characters}
+%
+% If you have redefined the internal font as described in section \ref{sec:internalfont},
+% you may notice that some characters are omitted without any error message
+% being shown. This happens if you have chosen, let's say, a font with
+% only 128~characters like the |cmtt10| font, but are using characters
+% that aren't represented in this font, e.\,g.~characters with codes
+% greater than~127.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{\texorpdfstring{\so{Letterspacing}}{Letterspacing}}
+%
+% \subsection{How it works}
+% \label{sec:so}
+%
+% The base macro for letterspacing is called \describemacro{\so}.
+% It typesets the given argument with \syn{inter-letter space}
+% between every two characters, \syn{inner space} between words
+% and \syn{outer space} before and after the spaced out text.
+% If we let ``$\cdot$'' stand for \syn{inter-letter space}, ``$\ast$''
+% for \syn{inner spaces} and ``$\bullet$'' for \syn{outer
+% spaces,} then the input on the left side of the following table
+% will yield the schematic output on the right side:
+%
+% \begin{center}
+% \def\.{$\cdot$}
+% \def\-{\kern1pt$\ast$\kern1pt}
+% \def\*{$\bullet$}
+% \def\_{\texttt{\char"20}}
+% \begin{tabular}{ccc}
+% 1.& \verb*|XX\so{aaa bbb ccc}YY|& \textsf{XXa\.a\.a\-b\.b\.b\-c\.c\.cYY}\\
+% 2.& \verb*|XX \so{aaa bbb ccc} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
+% 3.& \verb*|XX {\so{aaa bbb ccc}} YY|& \textsf{XX\*a\.a\.a\-b\.b\.b\-c\.c\.c\*\kern-1ptYY}\\
+% 4.& \verb*|XX \null{\so{aaa bbb ccc}}{} YY|& \textsf{XX\_a\.a\.a\-b\.b\.b\-c\.c\.c\_YY}\\
+% \end{tabular}
+% \end{center}
+% ^^A* % fool vim (fixes syntax highlighting)
+%
+% \noindent
+% Case~1 shows how letterspacing macros (\cs{\so} and \cs{\caps}) behave if
+% they aren't following or followed by a space: they omit outer space around
+% the \soul\ statement. Case~2 is what you'll mostly need---letterspaced
+% text amidst running text. Following and leading space get replaced by
+% \syn{outer space}. It doesn't matter if there are opening braces before
+% or closing braces afterwards. \soul\ can see through both of them (case~3).
+% Note that leading space has to be at least |5sp| wide to be recognized as
+% space, because \LaTeX\ uses tiny spaces generated by |\hskip1sp| as marker.
+% Case~4 shows how to enforce normal spaces instead of \syn{outer spaces:}
+% Preceding space can be hidden by |\kern0pt| or \cs{\null} or any character.
+% Following space can also be hidden by any token, but note that a typical macro name
+% like \cs{\relax} or \cs{\null} would also hide the space thereafter.
+%
+%
+% The values are predefined for typesetting facsimiles mainly with
+% \emph{Fraktur} fonts.
+% You can define your own spacing
+% macros or overwrite the original \cs{\so} meaning using the macro
+% \describemacro{\sodef}:
+%
+% \begin{syntax}
+% |\sodef|\<cmd>|{|\<font>|}{|\<inter-letter space>|}{|\<inner space>|}{|\<outer space>|}|
+% \end{syntax}
+%
+% The space dimensions, all of which are mandatory, should be defined in terms of |em|
+% letting them grow and shrink with the respective fonts.
+%
+% \begin{example}
+% |\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}|
+% \end{example}
+%
+% After that you can type `|\an{example}|' to get
+% {\sodef\an{}{.4em}{1em plus1em}{2em plus.1em minus.1em}^^A
+% `\an{example}'.}
+% The \describemacro{\resetso} command resets \cs{\so}
+% to the default values.
+%
+%
+%
+%
+% \subsection{Some examples}
+%
+%^^A=====================================================
+% \begin{examples}
+%
+% \soultest{Ordinary text}
+% |\so{electrical industry}|
+% {\so{electrical industry}}
+%
+% \soultest{Use \texttt{\string\-} to mark hyphenation points}
+% |\so{man\-u\-script}|
+% {\so{man\-u\-script}}
+%
+% \soultest{Accents are recognized}
+% |\so{le th\'e\^atre}|
+% {\so{le th\'e\^atre}}
+%
+% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
+% contains hyphenation points. The contents are treated as one, unbreakable entity}
+% |\so{just an \mbox{example}}|
+% {\so{just an \mbox{example}}}
+%
+% \soultest{Punctuation marks are spaced out, if they are
+% put into the group}
+% |\so{inside.} \& \so{outside}.|
+% {\so{inside.} \& \so{outside}.}
+%
+% \soultest{Space-out skips may be removed by typing \texttt{\string\<}.
+% It's, however, desirable to put the quotation marks out of
+% the argument}
+% |\so{``\<Pennsylvania\<''}|
+% {\so{``\<Pennsylvania\<''}}
+%
+% \soultest{Numbers should never be spaced out}
+% |\so{1\<3 December {1995}}|
+% {\so{1\<3 December {1995}}}
+%
+% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
+% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
+% afterwards}
+% |\so{input\slash output}|
+% {\so{input\slash output}}
+%
+% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
+% you have to protect the hyphen. This is no \soul\ restriction
+% but normal \TeX\ behavior}
+% |\so{\dots and \mbox{-}jet}|
+% {\so{\dots and \mbox{-}jet}}
+%
+% \soultest{The \texttt{\~} command inhibits line breaks}
+% |\so{unbreakable~space}|
+% {\so{unbreakable~space}}
+%
+% \soultest{\texttt{\string\\} works as usual. Additional arguments
+% like \texttt{*} or vertical space are not accepted, though}
+% |\so{broken\\line}|
+% {\so{broken\\line}}
+%
+% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
+% |\so{pretty awful\break test}|
+% {\so{pretty awful\break test}}
+%
+% \end{examples}
+%^^A=====================================================
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection[Typesetting \texorpdfstring{\caps{caps-and-small-caps}}{caps-and-small-caps} fonts]
+% {Typesetting capitals-and-small-capitals fonts}
+%
+% There is a special letterspacing command called \describemacro{\caps},
+% which differs from \cs{\so} in that it switches to caps-and-small-caps
+% font shape, defines only slight spacing and is able to select spacing
+% value sets from a database. This is a requirement for high-quality
+% typesetting \cite{Tschichold}. The following lines show the effect
+% of \cs{\caps} in comparison with the normal textfont and with
+% small-capitals shape:
+%
+% \def\sampletext{DONAUDAMPFSCHIFFAHRTSGESELLSCHAFT}
+% \medskip\noindent
+% \begin{tabular}{rl}
+% |\normalfont|&\sampletext\\
+% |\scshape|&{\scshape\sampletext}\\
+% |\caps|&\caps\sampletext\\
+% ^^A|\person|&\person\sampletext\\
+% \end{tabular}
+%
+% \medbreak\noindent
+% The \cs{\caps} font database is by default empty, i.\,e., it contains
+% just a single default entry, which yields the result as shown in the
+% example above.
+% New font entries may be added \emph{on top} of this list using the \describemacro{\capsdef}
+% command, which takes five arguments: The first argument describes the font with
+% \emph{encoding, family, series, shape,} and \emph{size,}^^A
+% \footnote{as defined by the \caps{NFSS}, the ``New Font Selection Scheme''}
+% each optionally
+% (e.\,g.~|OT1/cmr/m/n/10| for this very font, or only |/ppl///12| for all
+% \emph{palatino} fonts at size 12\,pt). The \emph{size} entry may also contain
+% a size range (\texttt{5-10}), where zero is assumed for an omitted lower
+% boundary (\texttt{-10}) and a very, very big number for an omitted upper
+% boundary (\texttt{5-}). The
+% upper boundary is not included in the range, so, in the example below, all
+% fonts with sizes greater or equal 5\,pt and smaller than 15\,pt are accepted
+% ($5\,\mbox{pt}\le size<15\,\mbox{pt}$).
+% The second argument may contain font switching commands such as \cs{\scshape},
+% it may as well be empty or contain debugging commands (e.\,g.~|\message{*}|).
+% The remaining three, mandatory arguments are the spaces as described in
+% section~\ref{sec:so}.
+%
+% \begin{example}
+% |\capsdef{T1/ppl/m/n/5-15}{\scshape}{.16em}{.4em}{.2em}|
+% \end{example}
+%
+% The \cs{\caps} command goes through the data list from top to bottom
+% and picks up the first matching set, so the order of definition is essential.
+% The last added entry is examined first, while the pre-defined default entry
+% will be examined last and will match any font, if no entry was taken before.
+%
+% To override the default values, just define a new default entry using
+% the identifier |{////}|. This entry should be defined first, because no
+% entry after it can be reached.
+%
+% The \cs{\caps} database can be cleared with the \describemacro{\capsreset}
+% command and will only contain the default entry thereafter. The
+% \describemacro{\capssave} command saves the whole current database
+% under the given name. \describemacro{\capsselect} restores such a database.
+% This allows to predefine different groups of \cs{\caps} data sets:
+%
+% \begin{example}
+% |\capsreset|\\
+% |\capsdef{/cmss///12}{}{12pt}{23pt}{34pt}|\\
+% |\capsdef{/cmss///}{}{1em}{2em}{3em}|\\
+% |...|\\
+% |\capssave{wide}|\\
+% \end{example}
+% \indent
+% \begin{example}
+% |%---------------------------------------|\\
+% |\capsreset|\\
+% |\capsdef{/cmss///}{}{.1em}{.2em}{.3em}|\\
+% |...|\\
+% |\capssave{narrow}|\\
+% \end{example}
+% \indent
+% \begin{example}
+% |%---------------------------------------|\\
+% |{\capsselect{wide}|\\
+% |\title{\caps{Yet Another Silly Example}}|\\
+% |}|\\
+% \end{example}
+%
+% See the `|example.cfg|' file for a detailed example.
+% If you have defined a bunch of sets for different fonts and sizes,
+% you may lose control over what fonts are used by the package. With the
+% package option \DescribeOption{capsdefault}\option{capsdefault} selected,
+% \cs{\caps} prints its argument underlined, if no set was specified for a
+% particular font and the default set had to be used.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Typesetting Fraktur}
+% \label{sec:fraktur}
+%
+% Black letter fonts^^A
+%^^A%%
+% \footnote{See the great black letter fonts, which \person{Yannis Haralambous}
+% kindly provided, and the \package{oldgerm} and \package{yfonts} package~\cite{yfonts}
+% as their \LaTeX\ interfaces.}
+%^^A%%
+% deserve some additional considerations. As stated in section~\ref{sec:typesetting},
+% the ligatures |ch|, |ck|, |sz|~(\cs{\ss}), and~|tz| have to remain unbroken in spaced out
+% \emph{Fraktur} text. This may look strange at first glance, but you'll get used to it:
+%
+% \begin{example}
+% |\textfrak{\so{S{ch}u{tz}vorri{ch}tung}}|
+% \end{example}
+%
+% You already know that grouping keeps the |soul| mechanism from separating such ligatures.
+% This is quite important for |s:|, |a*|, and~|"a|. As hyphenation is stronger than
+% grouping, especially the |sz| may cause an error, if hyphenation happens to occur between
+% the letters |s| and~|z|. (\TeX\ hyphenates the German word |auszer| wrongly like
+% |aus-zer| instead of like |au-szer|, because the German hyphenation patterns
+% do, for good reason, not see |sz| as `\cs{\ss}'.) In such cases you can protect tokens with the
+% sequence e.\,g.~|\mbox{sz}| or a properly defined command. The \cs{\ss} command,
+% which is defined by the \package{yfonts} package, and similar commands will suffice as well.
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Dirty tricks}
+% \label{sec:dirtytricks}
+%
+% Narrow columns are hard to set, because they don't allow much spacing
+% flexibility, hence long words often cause overfull boxes. A macro
+% could use \cs{\so} to insert stretchability between the single
+% characters. Table~\ref{tab:dirtytricks} shows some text typeset with such
+% a macro at the left side and under \emph{plain} conditions at
+% the right side, both with a width of~6\,pc.
+%
+% \def\sampletext{Some magazines and newspapers prefer this kind of spacing
+% because it reduces hyphenation problems to a minimum\<. Unfortunately\<, such
+% paragraphs aren't especially beautiful\<.}
+% \newbox\dirtytrick
+% \setbox\dirtytrick\vbox{
+% \batchmode ^^A we don't want to see all these overfull boxes ...
+% \leavevmode\hspace{0ptplus1fil}
+% \hbox{\parindent0pt\plainsetup\let\<\relax
+% \vtop{\hsize6pc\raggedright\sampletext}\hskip1em
+% \vtop{\hsize6pc\magstylepar\sampletext}\hskip1em
+% \vtop{\hsize6pc\sampletext}\hss}
+% \errorstopmode}
+%
+% \begin{table}
+% \begin{center}
+% \overfullrule5pt
+% \usebox\dirtytrick
+% \caption{Ragged-right, magazine style (using \soul), and block-aligned
+% in comparison. But, frankly, none of them is really acceptable.
+% (Don't do this at home, children!)}
+% \label{tab:dirtytricks}
+% \end{center}
+% \end{table}
+%
+%
+%
+%
+%
+%
+%
+% \section{\texorpdfstring{\ul{Underlining}}{Underlining}}
+%
+% The underlining macros are my answer to Prof.~\person{Knuth'{\normalfont s}}
+% exercise 18.26 from his \TeX{}book~\cite{DEK}. \texttt{:-)} Most of what
+% is said about the macro \describemacro{\ul} is also true of the
+% striking out macro \describemacro{\st} and the highlighting macro \describemacro{\hl},
+% both of which are in fact derived from the former.
+%
+%
+%
+%
+% \subsection{Settings}
+%
+% \subsubsection{Underline depth and thickness}
+%
+% The predefined \syn{underline depth} and \syn{thickness}
+% work well with most fonts. They can be changed using the macro \describemacro{\setul}.
+%
+% \begin{syntax}
+% |\setul{|\<underline depth>|}{|\<underline thickness>|}|
+% \end{syntax}
+%
+% Either dimension can be omitted, in which case there has to be
+% an empty pair of braces.
+% Both values should be defined in terms of |ex|, letting them
+% grow and shrink with the respective fonts.
+% The \describemacro{\resetul} command restores the standard values.
+%
+% Another way to set the \syn{underline depth} is to use the macro
+% \describemacro{\setuldepth}. It sets the depth such that the
+% underline's upper edge lies 1\,pt beneath the given argument's
+% deepest depth. If the argument is empty, all
+% letters---i.\,e.\ all characters whose \cs{\catcode} currently
+% equals 11---are taken. Examples:
+%
+% \begin{example}
+% |\setuldepth{ygp}|\\
+% |\setuldepth\strut|\\
+% |\setuldepth{}|\\
+% \end{example}
+%
+%
+%
+% \subsubsection{Line color}
+%
+% The underlines are by default black. The color can be changed by
+% using the \describemacro{\setulcolor} command. It takes one argument that can be any
+% of the color specifiers as described in the |color| package. This package
+% has to be loaded explicitly.
+%
+% \indent
+% \begin{example}
+% |\documentclass{article}|\\
+% |\usepackage{color,soul}|\\
+% |\definecolor{darkblue}{rgb}{0,0,0.5}|\\
+% |\setulcolor{darkblue}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\begin{document}|\\
+% |...|\\
+% |\ul{Cave: remove all the underlines!}|\\
+% |...|\\
+% |\end{document}|\\
+% \end{example}
+%
+%
+% The colors for overstriking lines and highlighting are likewise set
+% with \describemacro{\setstcolor} (default: black) and \describemacro{\sethlcolor}
+% (default: yellow). If the \package{color} package wasn't loaded,
+% underlining and overstriking color are black, while highlighting
+% is replaced by underlining.
+%
+%
+%
+%
+%
+%
+%
+% \subsubsection{The \program{dvips} problem}
+% \label{sec:dvips}
+%
+% \ul{Underlining}, \st{striking out} and highlighting build up
+% their lines with many short line segments. If you used the `\program{dvips}'
+% program with default settings, you would get little gaps on some places, because
+% the \emph{maxdrift} parameter allows the single objects to drift
+% this many pixels from their real positions.
+% \bigbreak
+%
+% \noindent
+% There are two ways to avoid the problem, where the \soul\ package
+% chooses the second by default:
+% \begin{enumerate}
+% \item
+% Set the \emph{maxdrift} value to zero, e.\,g.: |dvips -e 0 file.dvi|.
+% This is probably not a good idea, since the letters may then no longer be
+% spaced equally on low resolution printers.
+% \item
+% Let the lines stick out by a certain amount on each side so that they
+% overlap. This overlap amount can be set using the \describemacro{\setuloverlap}
+% command. It is set to 0.25\,pt by default. |\setuloverlap{0pt}| turns overlapping off.
+% \end{enumerate}
+%
+%
+%
+%
+%
+%
+% \subsection{Some examples}
+%
+%^^A=====================================================
+% \begin{examples}
+%
+% \soultest{Ordinary text}
+% |\ul{electrical industry}|
+% {\ul{electrical industry}}
+%
+% \soultest{Use \texttt{\string\-} to mark hyphenation points}
+% |\ul{man\-u\-script}|
+% {\ul{man\-u\-script}}
+%
+% \soultest{Accents are recognized}
+% |\ul{le th\'e\^atre}|
+% {\ul{le th\'e\^atre}}
+%
+% \soultest{\texttt{\string\mbox} and \texttt{\string\hbox} protect material that
+% contains hyphenation points. The contents are treated as one, unbreakable entity}
+% |\ul{just an \mbox{example}}|
+% {\ul{just an \mbox{example}}}
+%
+% \soultest{Explicit hyphens like |-|, |--| and |---| are recognized.
+% \texttt{\string\slash} outputs a slash and enables \TeX\ to break the line
+% afterwards}
+% |\ul{input\slash output}|
+% {\ul{input\slash output}}
+%
+% \soultest{To keep \TeX\ from breaking lines between the hyphen and `jet'
+% you have to protect the hyphen. This is no \soul\ restriction
+% but normal \TeX\ behavior}
+% |\ul{\dots and \mbox{-}jet}|
+% {\ul{\dots and \mbox{-}jet}}
+%
+% \soultest{The \texttt{\~} command inhibits line breaks}
+% |\ul{unbreakable~space}|
+% {\ul{unbreakable~space}}
+%
+% \soultest{\texttt{\string\\} works as usual. Additional arguments
+% like \texttt{*} or vertical space are not accepted, though}
+% |\ul{broken\\line}|
+% {\ul{broken\\line}}
+%
+% \soultest{\texttt{\string\break} breaks the line without filling it with white space}
+% |\ul{pretty awful\break test}|
+% {\ul{pretty awful\break test}}
+%
+% \soultest{Italic correction needs to be set manually}
+% |\ul{foo \emph{bar\/} baz}|
+% {\ul{foo \emph{bar\/} baz}}
+%
+% \end{examples}
+%^^A=====================================================
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Customization}
+%
+% \subsection{Adding accents}
+% \label{sec:soulaccent}
+%
+% The \soul\ scanner generally sees every input token separately.
+% It has to be taught that some tokens belong together. For accents this is done
+% by registering them via the \describemacro{\soulaccent} macro.
+%
+% \begin{syntax}
+% |\soulaccent{|\<accent command>|}|
+% \end{syntax}
+%
+% The standard accents, however, are already pre-registered:
+% |\`|, |\'|, |\^|, |\"|, |\~|, |\=|, |\.|, |\u|, |\v|, |\H|, |\t|,
+% |\c|, |\d|, |\b|, and |\r|. If used together with the \package{german}
+% package, \soul\ automatically adds the |"| command.
+% Let's assume you have defined |\%| to put some weird accent on
+% the next character. Simply put the following line into your |soul.cfg|
+% file (see section~\ref{sec:config}):
+%
+% \begin{example}
+% |\soulaccent{\%}|
+% \end{example}
+%
+% Note that active characters like the |"| command have already
+% to be \cs{\active} when they are stored or they won't be recognized
+% later. This can be done temporarily, as in |{\catcode\`"\active\soulaccent{"}}|.
+%
+%
+%
+%
+% \subsection{Adding font commands}
+% \label{sec:soulregister}
+%
+% To convince \soul\ not to feed font switching (or other)
+% commands to the analyzer, but rather to execute them immediately,
+% they have to be registered, too. The \describemacro{\soulregister} macro
+% takes the name of a command name and either |0| or |1| for the number
+% of arguments:
+%
+% \begin{syntax}
+% |\soulregister{|\<command name>|}{|\<number of arguments>|}|
+% \end{syntax}
+%
+% If \cs{\bf} and \cs{\emph} weren't already registered, you would
+% write the following into your |soul.cfg| configuration file:
+%
+% \begin{example}
+% |\soulregister{\bf}{0} % {\bf foo}| \\
+% |\soulregister{\emph}{1} % \emph{bar}|\\
+% \end{example}
+%
+%
+% All standard \TeX\ and \LaTeX\ font commands, as well as the
+% \package{yfonts} commands are already pre-registered:
+%
+% \begin{example}
+% |\em, \rm, \bf, \it, \tt, \sc, \sl, \sf, \emph, \textrm,|\\
+% |\textsf, \texttt, \textmd, \textbf, \textup, \textsl,|\\
+% |\textit, \textsc, \textnormal, \rmfamily, \sffamily,|\\
+% |\ttfamily, \mdseries, \upshape, \slshape, \itshape,|\\
+% |\scshape, \normalfont, \tiny, \scriptsize, \footnotesize,|\\
+% |\small, \normalsize, \large, \Large, \LARGE, \huge, \Huge,|\\
+% |\MakeUppercase, \textsuperscript, \footnote,|\\
+% |\textfrak, \textswab, \textgoth, \frakfamily,|\\
+% |\swabfamily, \gothfamily|\\
+% \end{example}
+%
+% You can also register other commands as fonts, so the
+% analyzer won't see them. This may be necessary for some
+% macros that \soul\ refuses to typeset correctly.
+% But note, that \cs{\so} and \cs{\caps} won't put their
+% letter-skips around then.
+%
+%
+%
+%
+%
+%
+% \subsection{Changing the internal font}
+% \label{sec:internalfont}
+%
+% The \soul\ package uses the |ectt1000| font while it analyzes
+% the syllables. This font is used, because it
+% has 256~mono-spaced characters without any kerning.
+% It belongs to \person{J\"org Knappen'\textrm{s}}
+% \caps{EC}-fonts, which should be part of every modern \TeX\ installation.
+% If \TeX\ reports ``\texttt{I can't find file `ectt1000'}'' you don't
+% seem to have this font installed. It is recommended that
+% you install at least the file |ectt1000.tfm| which has less than 1.4\,kB\null.
+% Alternatively, you can let the \soul\ package use the |cmtt10| font that
+% is part of any installation, or some other mono-spaced font:
+%
+% \begin{example}
+% |\font\SOUL@tt=cmtt10|
+% \end{example}
+%
+% Note, however, that \soul\ does only handle characters,
+% for which the internal font has a character with the same
+% character code. As |cmtt10| contains only characters with codes
+% 0 to~127, you can't typeset characters with codes 128 to~255.
+% These 8-bit character codes are used by many fonts with non-ascii
+% glyphs. So the |cmtt10| font will, for example, not work for |T2A|
+% encoded cyrillic characters.
+%
+%
+%
+%
+%
+%
+%
+% \subsection{The configuration file}
+% \label{sec:config}
+%
+% If you want to change the predefined settings or add new features,
+% then create a file named `|soul.cfg|' and put it in a directory, where \TeX\
+% can find it. This configuration file will then be loaded
+% at the end of the |soul.sty| file, so you may redefine
+% any settings or commands therein, select package options and even
+% introduce new ones. But if you intend to give
+% your documents to others, don't forget to give them the
+% required configuration files, too! That's how such a file
+% could look like:
+%
+% \indent
+% \begin{example}
+% |% define macros for logical markup|\\
+% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
+% \\
+% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
+% |\DeclareRobustCommand*\versal[1]{%|\\
+% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
+% |}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |% load the color package and set|\\
+% |% a different highlighting color|\\
+% |\RequirePackage{color}|\\
+% |\definecolor{lightblue}{rgb}{.90,.95,1}|\\
+% |\sethlcolor{lightblue}|\\
+% |\endinput|
+% \end{example}
+%
+% You can safely use the |\SOUL@@@| namespace for internal macros---it
+% won't be used by the \soul\ package in the future.
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{Miscellaneous}
+%
+% \subsection{Using \texorpdfstring{\soul\ }{soul }with other flavors of \texorpdfstring{\TeX}{TeX}}
+% \label{sec:plain}
+%
+% This documentation describes how to use \soul\ together
+% with \LaTeXe, for which it is optimized. It works, however, with
+% all other flavors of \TeX, too. There are just some minor restrictions
+% for Non-\LaTeX\ use:
+%
+% The \cs{\caps} command doesn't use a database, it is only a dumb
+% definition with fixed values. It switches to \cs{\capsfont}, which---unless
+% defined explicitly like in the following example---won't really change
+% the used font at all. The commands \cs{\capsreset} and \cs{\capssave}
+% do nothing.
+%
+% \begin{example}
+% |\font\capsfont=cmcsc10|\\
+% |\caps{Tschichold}|\\
+% \end{example}
+%
+% None of the commands are made `robust', so they have to be
+% explicitly protected in fragile environments like in \cs{\write}
+% statements.
+% To make use of colored underlines or highlighting you have to
+% use the \package{color} package wrapper from \caps{CTAN}^^A
+% \footnote{\texttt{CTAN:/macros/plain/graphics/\char`\{miniltx.tex,color.tex\char`\}}},
+% instead of the \package{color} package directly:
+%
+% \begin{example}
+% |\input color|\\
+% |\input soul.sty|\\
+% |\hl{highlighted}|\\
+% |\bye|\\
+% \end{example}
+%
+% The \option{capsdefault} package option is mapped to a simple command
+% \describemacro{\capsdefault}.
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Using \texorpdfstring{\soul\ }{soul }commands for logical markup}
+% \label{sec:markup}
+%
+% It's generally a bad idea to use font style commands like \cs{\textsc}
+% in running text. There should always be some reasoning behind changing
+% the style, such as ``names of persons shall be typeset in a caps-and-small-caps
+% font''. So you declare in your text just that some words are the name of a
+% person, while you define in the preamble or, even better, in a separate
+% style file how to deal with persons:
+%
+% \begin{example}
+% |\newcommand*\person{\textsc}|\\
+% |...|\\
+% |``I think it's a beautiful day to go to the zoo and feed|\\
+% |the ducks. To the lions.'' --~\person{Brian Kantor}|\\
+% \end{example}
+%
+% It's quite simple to use \soul\ commands that way:
+%
+% \begin{example}
+% |\newcommand\comment*{\ul} % or \let\comment=\ul|\\
+% |\sodef\person{\scshape}{0.125em}{0.4583em}{0.5833em}|\\
+% \end{example}
+%
+% Letterspacing commands like \cs{\so} and \cs{\caps} have to
+% check whether they are followed by white space, in which case
+% they replace that space by \syn{outer space}. Note that \soul\
+% does look through closing braces. Hence you can conveniently bury
+% a \soul\ command within another macro like in the following
+% example. Use any other token to hide following space if necessary,
+% for example the \cs{\null} macro.
+%
+% \begin{example}
+% |\DeclareRobustCommand*\versal[1]{%|\\
+% | \MakeUppercase{\SOUL@@@versal{#1}}%|\\
+% |}|\\
+% |\sodef\SOUL@@@versal{\upshape}{0.125em}{0.4583em}{0.5833em}|\\
+% \end{example}
+%
+%
+% But what if the \soul\ command is for some reason not the last one
+% in that macro definition and thus cannot look ahead at the following token?
+%
+%
+% \begin{example}
+% |\newcommand*\somsg[1]{\so{#1}\message{#1}}|\\
+% |...|\\
+% |foo \somsg{bar} baz % wrong spacing after `bar'!|\\
+% \end{example}
+%
+% In this case you won't get the following space replaced by \emph{outer space}
+% because when \soul\ tries to look ahead, it only sees the token
+% \cs{\message} and consequently decides that there is no space to replace.
+% You can get around this by explicitly calling the space scanner again.
+%
+% \begin{example}
+% |\newcommand*\somsg[1]{{%|\\
+% | \so{#1}%|\\
+% | \message{bar}%|\\
+% | \let\\\SOUL@socheck|\\
+% | \\%|\\
+% |}}|\\
+% \end{example}
+%
+% However, \cs{\SOUL@socheck} can't be used directly, because it would discard
+% any normal space. \cs{\\} doesn't have this problem.
+% The additional pair of braces avoids that its definition leaks out
+% of this macro. In the example above you could, of course, simply
+% have put \cs{\message} in front, so you hadn't needed to
+% use the scanner macro \cs{\SOUL@socheck} at all.
+%
+% Many packages do already offer logical markup commands that default
+% to some standard \LaTeX\ font commands or to \cs{\relax}. One example
+% is the \package{jurabib} package~\cite{jurabib}, which makes the use of
+% \soul\ a challenge. This package implements lots of
+% formatting macros. Let's have a look at one of them, \cs{\jbauthorfont},
+% which is used to typeset author names in citations.
+% The attempt to simply
+% define |\let\jbauthorfont\caps| fails, because the macro isn't directly
+% applied to the author name as in |\jbauthorfont{Don Knuth}|, but
+% to another command sequence: |\jbauthorfont{\jb@@author}|. Not even
+% \cs{\jb@@author} contains the name, but instead further commands that
+% at last yield the requested name. That's why we have to expand
+% the contents first. This is quite tricky, because we must not
+% expand too much, either. Fortunately, we can offer the contents
+% wrapped up in yet another macro, so that \soul\ knows that it has to
+% use its own macro expansion mechanism:
+%
+% \begin{example}
+% |\renewcommand*\jbauthorfont[1]{{%|\\
+% | \def\x{#1}%|\\
+% | \caps\x|\\
+% |}}|\\
+% \end{example}
+%
+% Some additional kerning after |\caps\x| wouldn't hurt, because
+% the look-ahead scanner is blinded by further commands that follow
+% in the \package{jurabib} package. Now we run into the next problem:
+% cited names may contain commands
+% that must not get expanded. We have to register them as special
+% command:
+%
+% \begin{example}
+% |\soulregister\jbbtasep{0}|\\
+% |...|\\
+% \end{example}
+%
+% But such registered commands bypass \soul's kernel and we don't
+% get the correct spacing before and afterwards. So we end up
+% redefining \cs{\jbbtasep}, whereby you should, of course, use
+% variables instead of numbers:
+%
+% \begin{example}
+% |\renewcommand*\jbbtasep{%|\\
+% | \kern.06em|\\
+% | \slash|\\
+% | \hskip.06em|\\
+% | \allowbreak|\\
+% |}|\\
+% \end{example}
+%
+% Another problem arises: bibliography entries that must not get
+% teared apart are supposed to be enclosed in additional braces.
+% This, however, won't work with \soul\ because of
+% \ref{par:Grouping hyphenatable material}. A simple trick will
+% get you around that problem: define a dummy command that only
+% outputs its argument, and register that command:
+%
+% \begin{example}
+% |\newcommand*\together[1]{#1}|\\
+% |\soulregister\together{1}|\\
+% \end{example}
+%
+% Now you can write ``|Author = {\together{Don Knuth}}|'' and
+% \package{jurabib} won't dare to reorder the parts of the name.
+% And what if some name shouldn't get letterspaced at all? Overriding
+% a conventional font style like \cs{\textbf} that was globally
+% set is trivial, you just have to specify the style that you
+% prefer in that very bibliography entry. In our example, if we
+% wanted to keep \soul\ from letterspacing a particular entry,
+% although they are all formatted by our \cs{\jbauthorfont}
+% and hence fed to \cs{\caps}, we'd use the following construction:
+%
+% \begin{example}
+% |Author = {\soulomit{\normalfont\huge Donald E. Knuth}}|\\
+% \end{example}
+%
+% The \package{jurabib} package is probably one of the more
+% demanding packages to collaborate with \soul. Everything else
+% can just become easier.
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Typesetting long words in narrow columns}
+% \label{sec:sloppyword}
+%
+% Narrow columns are best set |flushleft|, because not even the best
+% hyphenation algorithm can guarantee acceptable line breaks without
+% overly stretched spaces.
+% However, in some rare cases one may be \emph{forced} to typeset
+% block aligned. When typesetting in languages like German, where
+% there are really long words, the \describemacro{\sloppyword} macro
+% might help a little bit. It adds enough stretchability between the
+% single characters to make the hyphenation algorithm happy, but
+% is still not as ugly as the example in section~\ref{sec:dirtytricks}
+% demonstrates. In the following example the left column was typeset
+% as ``|Die \sloppyword{Donau...novelle} wird ...|'':
+%
+% \begin{center}
+% \def\word{Do\-nau\-dampf\-schiff\-fahrts\-ge\-sell\-schafts\-^^A
+% ka\-pi\-t\"ans\-wit\-wen\-pen\-si\-ons\-ge\-setz\-no\-vel\-le}
+% \begin{minipage}{1.5in}
+% \plainsetup
+% Die
+% \expandafter\sloppyword\expandafter{\word}
+% wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
+% \end{minipage}
+% \hspace{1em}
+% \batchmode
+% \begin{minipage}{1.5in}
+% \plainsetup
+% Die \word\ wird mit sofortiger Wirkung au\ss er Kraft gesetzt.
+% \end{minipage}
+% \errorstopmode
+% \end{center}
+%
+%
+%
+%
+%
+%
+%
+% \subsection{Using \texorpdfstring{\soul\ }{soul }commands in section headings}
+%
+% Letterspacing was often used for section titles in the past,
+% mostly centered and with a closing period. The following example
+% shows how to achieve this using the \package{titlesec}
+% package \cite{titlesec}:
+%
+% \begin{example}
+% |\newcommand*\periodafter[2]{#1{#2}.}|\\
+% |\titleformat{\section}[block]|\\
+% | {\normalfont\centering}|\\
+% | {\thesection.}|\\
+% | {.66em}|\\
+% | {\periodafter\so}|\\
+% |...|\\
+% |\section{Von den Maassen und Maassst\"aben}|\\
+% \end{example}
+%
+% \bigbreak
+% This yields the following output:
+%
+% \bigskip
+% \newbox\examplebox
+% \sbox\examplebox{
+% \begin{minipage}{.9\textwidth}
+% \small
+% \bigskip
+% \begin{center}
+% \so{1\<. Von den Maassen und Maassst\"aben}.
+% \bigskip
+% \end{center}
+% \end{minipage}}
+% \fbox{\usebox\examplebox}
+% \bigbreak
+%
+% \noindent
+% The \cs{\periodafter} macro adds a period to the title, but not to
+% the entry in the table of contents. It takes the name of a command as
+% argument, that shall be applied to the title, for example~\cs{\so}.
+% Here's a more complicated and complete example:
+%
+% \begin{example}
+% |\documentclass{article}|\\
+% |\usepackage[latin1]{inputenc}|\\
+% |\usepackage[T1]{fontenc}|\\
+% |\usepackage{german,soul}|\\
+% |\usepackage[indentfirst]{titlesec}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\newcommand*\sectitle[1]{%|\\
+% | \MakeUppercase{\so{#1}.}\\[.66ex]|\\
+% | \rule{13mm}{.4pt}}|\\
+% |\newcommand*\periodafter[2]{#1{#2.}}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\titleformat{\section}[display]|\\
+% | {\normalfont\centering}|\\
+% | {\S. \thesection.}|\\
+% | {2ex}|\\
+% | {\sectitle}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\titleformat{\subsection}[block]|\\
+% | {\normalfont\centering\bfseries}|\\
+% | {\thesection.}|\\
+% | {.66em}|\\
+% | {\periodafter\relax}|\\
+% \end{example}
+%
+% \indent
+% \begin{example}
+% |\begin{document}|\\
+% |\section{Von den Maassen und Maassst\"aben}|\\
+% |\subsection{Das L\"angenmaass im Allgemeinen}|\\
+% \\
+% |Um L\"angen genau messen und vergleichen zu k\"onnen,|\\
+% |bedarf es einer gewissen, bestimmten Einheit, mit der|\\
+% |man untersucht, wie oft sie selbst, oder ihre Theile,|\\
+% |in der zu bestimmenden L\"ange enthalten sind.|\\
+% |...|\\
+% |\end{document}|
+% \end{example}
+%
+% \bigbreak
+% This example gives you roughly the following output,
+% which is a facsimile from~\cite{Muszynski}.
+%
+% \bigskip
+% \sbox\examplebox{
+% \begin{minipage}{.9\textwidth}
+% \small
+% \bigskip
+% \begin{center}
+% \S. 1.\\[2ex]
+% \so{VON DEN MAASSEN UND MAASSST\"ABEN}.\\[.66ex]
+% \rule{12mm}{.4pt}\\[1.66ex]
+% \textbf{1. Das L\"angenmaass im Allgemeinen.}\\[.66em]
+% \end{center}
+% \leavevmode\qquad
+% Um L\"angen genau messen und vergleichen zu k\"onnen,
+% bedarf es einer gewissen, bestimmten Einheit, mit der
+% man untersucht, wie oft sie selbst, oder ihre Theile,
+% in der zu bestimmenden L\"ange enthalten sind.
+% \bigskip
+% \end{minipage}}
+% \fbox{\usebox\examplebox}
+% \bigbreak
+%
+% \noindent
+% Note that the definition of \cs{\periodafter} decides if
+% the closing period shall be spaced out with the title (1), or
+% follow without space (2):
+%
+% \begin{example}
+% 1.\qquad|\newcommand*\periodafter[2]{#1{#2.}}|\\
+% 2.\qquad|\newcommand*\periodafter[2]{#1{#2}.}|\\
+% \end{example}
+%
+%
+%
+% \noindent
+% If you need to underline section titles, you can easily
+% do it with the help of the \package{titlesec} package. The following
+% example underlines the section title, but not the section
+% number:
+%
+% \begin{example}
+% |\titleformat{\section}|\\
+% | {\LARGE\titlefont}|\\
+% | {\thesection}|\\
+% | {.66em}|\\
+% | {\ul}|\\
+% \end{example}
+%
+% \noindent
+% The \cs{\titlefont} command is provided by the \caps{``\small{KOMA}}~script''
+% package. You can write |\normalfont\sffamily\bfseries| instead.
+% The following example does additionally underline the section number:
+%
+% \begin{example}
+% |\titleformat{\section}|\\
+% | {\LARGE\titlefont}|\\
+% | {\ul{\thesection{\kern.66em}}}|\\
+% | {0pt}|\\
+% | {\ul}|\\
+% \end{example}
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+%
+% \section{How the package works}
+%
+% \subsection{The kernel}
+% \so{Letterspacing,} \ul{underlining}, \st{striking out} and highlighting
+% use the same kernel. It lets a \emph{word scanner} run over the given argument,
+% which inspects every token. If a token is a command registered via \cs{\soulregister},
+% it is executed immediately. Other tokens are only counted and trigger some action
+% when a certain number is reached (quotes and dashes). Three subsequent `|-|', for example,
+% trigger |\SOUL@everyexhyphen{---}|. A third group leads to special actions,
+% like |\mbox| that starts reading-in a whole group to protect its contents and let them be
+% seen as one entity. All other tokens, mostly characters and digits, are collected in
+% a word register, which is passed to the analyzer, whenever a whole word was read in.
+%
+% The analyzer typesets the word in a 1\,sp ($=\frac1{65536}$\,pt) wide \cs{\vbox},
+% hence encouraging \TeX\ to break lines at every possible hyphenation point. It
+% uses the mono-spaced \cs{\SOUL@tt} font (|ectt1000|), so as to avoid any inter-character
+% kerning. Now the \cs{\vbox} is decomposed splitting off \cs{\hbox} after \cs{\hbox}
+% from the bottom. All boxes, each of which contains one syllable, are pushed onto a
+% stack, which is provided by \TeX's grouping mechanism. When returning from the
+% recursion, box after box is fetched from the stack, its width measured and fed to the
+%``reconstructor''.
+%
+% This reconstruction macro (\cs{\SOUL@dosyllable}) starts to read tokens
+% from the just analyzed word until the given syllable
+% width is obtained. This is repeated for each syllable. Every time the engine
+% reaches a relevant state, the corresponding driver macro is executed
+% and, if necessary, provided with some data. There is a macro that is
+% executed for each token, one for each syllable, one for each space etc\null.
+%
+% The engine itself doesn't know how to letterspace or to underline. It
+% just tells the selected driver about the structure of the given argument.
+% There's a default driver (\cs{\SOUL@setup}) that does only set the
+% interface macros to a reasonable default state, but doesn't really do anything.
+% Further drivers can safely inherit these settings and only need to
+% redefine what they want to change.
+%
+%
+%
+%
+%
+% \subsection{The interface}
+% \label{sec:interface}
+%
+% \subsubsection{The registers}
+%
+% The package offers eight interface macros that can be used to define
+% the required actions. Some of the macros receive data as macro parameter
+% or in special \emph{token} or \emph{dimen} registers. Here is a list of
+% all available registers:
+%
+% \begin{labeling}{\hspace{.36\hsize}}
+% \item[\texttt{\string\SOUL@token}]
+% This token register contains the current token. It has to be used as |\the\SOUL@token|.
+% The macro \cs{\SOUL@gettoken} reads the next token into \cs{\SOUL@token} and
+% can be used in any interface macro. If you don't want to lose the old meaning,
+% you have to save it explicitly. \cs{\SOUL@puttoken} pushes the token
+% back into the queue, without changing \cs{\SOUL@token}. You can only
+% put one token back, otherwise you get an error message.
+% \item[\texttt{\string\SOUL@lasttoken}]
+% This token register contains the last token.
+% \item[\texttt{\string\SOUL@syllable}]
+% This token register contains all tokens that were already collected for
+% the current syllable. When used in \cs{\SOUL@everysyllable}, it
+% contains the \emph{whole} syllable.
+% \item[\texttt{\string\SOUL@charkern}]
+% This dimen register contains the kerning value between the current and the next character.
+% Since most character pairs don't require a kerning value to be applied and the
+% output in the logfile shouldn't be cluttered with |\kern0pt| it is
+% recommended to write |\SOUL@setkern\SOUL@charkern|, which sets
+% kerning for non-zero values only.
+% \item[\texttt{\string\SOUL@hyphkern}]
+% This dimen register contains the kerning value between the current character
+% and the hyphen character or, when used in \cs{\SOUL@everyexhyphen}, the
+% kerning between the last character and the explicit hyphen.
+% \end{labeling}
+%
+%
+%
+%
+%
+%
+% \subsubsection{The interface macros}
+%
+% The following list describes each of the interface macros and which
+% registers it can rely on. The mark between label and description
+% will be used in section \ref{sec:interfaceexamples} to show when
+% the macros are executed. The addition |#1| means that the macro
+% takes one argument.
+%
+% \begin{labeling}{\hspace{.36\hsize}}
+% \def\m#1{\leavevmode\llap{\hbox to1em{\hss#1\hss}\hskip.7em}}
+% \item[\texttt{\string\SOUL@preamble}]\m{$P$}^^A
+% executed once at the beginning
+% \item[\texttt{\string\SOUL@postamble}]\m{$E$}^^A
+% executed once at the end
+% \item[\texttt{\string\SOUL@everytoken}]\m{$T$}^^A
+% executed after scanning a token; It gets that
+% token in \cs{\SOUL@token} and has to care for inserting
+% the kerning value \cs{\SOUL@charkern} between this and the next character.
+% To look at the next character, execute \cs{\SOUL@gettoken}, which
+% replaces \cs{\SOUL@token} by the next token. This token has to
+% be put back into the queue using \cs{\SOUL@puttoken}.
+% \item[\texttt{\string\SOUL@everysyllable}]\m{$S$}^^A
+% This macro is executed after scanning a whole syllable. It gets the
+% syllable in \cs{\SOUL@syllable}.
+% \item[\texttt{\string\SOUL@everyhyphen}]\m{$-$}^^A
+% This macro is executed at every implicit hyphenation point.
+% It is responsible for setting the hyphen and will likely do this
+% in a \cs{\discretionary} statement. It has to care about the
+% kerning values. The registers \cs{\SOUL@lasttoken}, \cs{\SOUL@syllable},
+% \cs{\SOUL@charkern} and \cs{\SOUL@hyphkern} contain useful information.
+% Note that \cs{\discretionary} inserts \cs{\exhyphenpenalty}
+% if the first part of the discretionary is empty, and
+% \cs{\hyphenpenalty} else.
+% \item[\texttt{\string\SOUL@everyexhyphen\#1}]\m{$=$}^^A
+% This macro is executed at every explicit hyphenation point. The
+% hyphen `character' (one of hyphen, en-dash, em-dash or \cs{\slash})
+% is passed as parameter |#1|. A minimal implementation
+% would be |{#1\penalty\exhyphenpenalty}|. The kerning value
+% between the last character and the hyphen is passed in \cs{\SOUL@hyphkern},
+% that between the hyphen and the next character in \cs{\SOUL@charkern}.
+% The last syllable can be found in \cs{\SOUL@syllable}, the last
+% character in \cs{\SOUL@lasttoken}.
+% \item[\texttt{\string\SOUL@everyspace\#1}]\m{\texttt{\char`\ }}^^A
+% This macro is executed between every two words. It is responsible for
+% setting the space. The engine submits a \cs{\penalty} setting as
+% parameter |#1| that should be put in front of the space. The
+% macro should at least do |{#1\space}|. Further information can be found in
+% \cs{\SOUL@lasttoken} and \cs{\SOUL@syllable}. Note that this macro does not
+% care for the leading and trailing space. This is the job of
+% \cs{\SOUL@preamble} and \cs{\SOUL@postamble}.
+% \end{labeling}
+%
+%
+%
+%
+%
+%
+% \subsubsection{Some examples}
+% \label{sec:interfaceexamples}
+%
+% The above list's middle column shows a mark that indicates in the
+% following examples, when the respective macros are executed:\nopagebreak
+%
+% \begin{labeling}{\hspace{.36\hsize}}
+% \item[\normalfont\an{word}]
+% \cs{\SOUL@everytoken}$^T$ is executed for every token. \cs{\SOUL@everysyllable}$^S$
+% is \emph{additionally} executed for every syllable. You will mostly just
+% want to use either of them.
+% \item[\normalfont\an{one two}]
+% The macro |\SOUL@everyspace| is executed at every space within
+% the \soul\ argument. It has to take one argument, that can either
+% be empty or contain a penalty, that should be applied to the space.
+% \item[\normalfont\an{example}\kern-1em]
+% The macro |\SOUL@everyhyphen| is executed at every possible
+% implicit hyphenation point.
+% \item[\normalfont\an{beta-test}]
+% Explicit hyphens trigger \cs{\SOUL@everyexhyphen}.
+% \end{labeling}
+%
+%
+%
+% \bigbreak
+% \noindent
+% It's only natural that these examples, too,
+% were automatically typeset by the |soul| package
+% using a special driver:
+%
+% \begin{example}
+% |\DeclareRobustCommand*\an{%|\\
+% | \def\SOUL@preamble{$^{^P}$}%|\\
+% | \def\SOUL@everyspace##1{##1\texttt{\char`\ }}%|\\
+% | \def\SOUL@postamble{$^{^E}$}%|\\
+% | \def\SOUL@everyhyphen{$^{^-}$}%|\\
+% | \def\SOUL@everyexhyphen##1{##1$^{^=}$}%|\\
+% | \def\SOUL@everysyllable{$^{^S}$}%|\\
+% | \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}%|\\
+% | \def\SOUL@everylowerthan{$^{^L}$}%|\\
+% | \SOUL@}|\\
+% \end{example}
+%
+%
+%
+%
+%
+%
+%
+%
+% \subsection{A driver example}
+%
+% Let's define a \soul\ driver that allows to typeset text
+% with a \cs{\cdot} at every potential hyphenation point. The name of
+% the macro shall be \cs{\sy} (for \emph{syllables}).
+% Since the \soul\ mechanism is highly fragile, we use the \LaTeX\
+% command \cs{\DeclareRobustCommand}, so that the \cs{\sy} macro
+% can be used even in section headings etc. The \cs{\SOUL@setup}
+% macro sets all interface macros to reasonable default definitions.
+% This could of course be done manually, too. As we won't
+% make use of \cs{\SOUL@everytoken} and \cs{\SOUL@postamble}
+% and both default to \cs{\relax}, anyway, we don't have to
+% define them here.
+%
+% \begin{example}
+% |\DeclareRobustCommand*\sy{%|\\
+% | \SOUL@setup|\\
+% \end{example}
+%
+% We only set \cs{\lefthyphenmin} and \cs{\righthyphenmin} to zero
+% at the beginning. All changes are restored automatically,
+% so there's nothing to do at the end.
+%
+% \begin{example}
+% | \def\SOUL@preamble{\lefthyphenmin=0 \righthyphenmin=0 }%|\\
+% \end{example}
+%
+% We only want simple spaces. Note that these are not provided
+% by default! \cs{\SOUL@everyspace} may get a penalty to be
+% applied to that space, so we set it before.
+%
+% \begin{example}
+% | \def\SOUL@everyspace##1{##1\space}%|\\
+% \end{example}
+%
+% There's nothing to do for \cs{\SOUL@everytoken}, we rather let
+% \cs{\SOUL@everysyllable} handle a whole syllable at once.
+% This has the advantage, that we don't have to deal with
+% kerning values, because \TeX\ takes care of that.
+%
+% \begin{example}
+% | \def\SOUL@everysyllable{\the\SOUL@syllable}|\\
+% \end{example}
+%
+% The \TeX\ primitive \cs{\discretionary}
+% takes three arguments: 1.~pre-hyphen material
+% 2.~post-hyphen material, and 3.~no-hyphenation material.
+%
+% \begin{example}
+% | \def\SOUL@everyhyphen{%|\\
+% | \discretionary{%|\\
+% | \SOUL@setkern\SOUL@hyphkern|\\
+% | \SOUL@sethyphenchar|\\
+% | }{}{%|\\
+% | \hbox{\kern1pt$\cdot$}%|\\
+% | }%|\\
+% | }%|\\
+%\end{example}
+%
+% Explicit hyphens like dashes and slashes shall be set normally.
+% We just have to care for kerning. The hyphen has to be put in
+% a box, because, as \cs{\hyphenchar}, it would yield its own, internal
+% \cs{\discretionary}. We need to set ours instead, though.
+%
+% \begin{example}
+% | \def\SOUL@everyexhyphen##1{%|\\
+% | \SOUL@setkern\SOUL@hyphkern|\\
+% | \hbox{##1}%|\\
+% | \discretionary{}{}{%|\\
+% | \SOUL@setkern\SOUL@charkern|\\
+% | }%|\\
+% | }|%\\
+% \end{example}
+%
+% Now that the interface macros are defined, we can start the scanner.
+%
+% \begin{example}
+% | \SOUL@|\\
+% |}|\\
+% \end{example}
+%
+% \hyphenation{al-go-rithm lin-guists ex-cel-lent} ^^A correct?
+% \noindent
+% \emph{\sy{This little macro will hardly be good enough
+% for linguists, although it uses {\TeX's} excellent hyphenation algorithm,
+% but it is at least a nice alternative to the}} \cs{\showhyphens} \emph{\sy{command}.}
+%
+%
+%
+%
+%
+%
+%
+% \section*{Acknowledgements}
+%
+% A big thank you goes to \person{Stefan Ulrich} for his tips and bug reports
+% during the development of versions 1.\lower2pt\hbox{*} and for his lessons on high quality
+% typesetting. The \cs{\caps} mechanism was very much influenced by his
+% suggestions. Thanks to \person{Alexander Shibakov} and \person{Frank Mittelbach,}
+% who sent me a couple of bug reports and feature requests, and finally encouraged
+% me to (almost) completely rewrite \soul. \person{Thorsten Manegold} contributed
+% a series of bug reports, helping to fix \soul's macro expander and hence making
+% it work together with the \package{jurabib} package.
+% Thanks to \person{Axel Reichert, Anshuman Pandey,} and \person{Peter Kreynin} for
+% detailed bug reports.
+% \person{Rowland McDonnel} gave useful hints for how to improve the documentation,
+% but I'm afraid he will still not be satisfied, and rightfully so. If only documentation
+% writing weren't that boring.~~\texttt{;-)}
+%
+%
+%
+%
+%
+%
+%
+% \begin{thebibliography}{00}
+% \raggedright
+%
+% \bibitem{jurabib}{\person{Berger, Jens:} \bibtitle{The jurabib package.} \CTAN-Archive, 2002, v0.52h.}
+%
+% \bibitem{titlesec}{\person{Bezos, Javier:} \bibtitle{The titlesec and titletoc package.}
+% \CTAN-Archive, 1999, v2.1.}
+%
+% \bibitem{color}{\person{Carlisle, D. P.:} \bibtitle{The color package.} \CTAN-Archive, 1997, v1.0d.}
+%
+% \bibitem{Duden}{Duden, Volume 1. \bibtitle{Die Rechtschreibung.} Bibliographisches Institut,
+% Mann\-heim--\hskip0pt Wien--Z\"urich, 1986, 19th~edition.}
+%
+% \bibitem{DEK}{\person{Knuth, Donald E.:} \bibtitle{The \TeX book.}
+% Addison--Wesley Publishing Company, Reading/Massachusetts, 1989, 16th~edition.}
+%
+% \bibitem{Muszynski}{\person{Muszynski, Carl} and \person{P\v rihoda, Eduard:}
+% \bibtitle{Die Terrainlehre in Verbindung mit der Darstellung, Beurtheilung und
+% Beschreibung des Terrains vom milit\"arischen
+% Standpunkte.}
+% L.\,W.~Seidel \&\ Sohn, Wien, 1872.}
+%
+% \bibitem{Reglement}{Normalverordnungsblatt f\"ur das k.\,u.\,k.~Heer.
+% \bibtitle{Exercier-Reglement f\"ur die k.\,u.\,k.~Cavallerie, I. Theil.}
+% Wien, k.\,k.~Hof- und Staatsdruckerei, 1898, 4th~edition.}
+%
+% \bibitem{german}{\person{Raichle, Bernd:} \bibtitle{The german package.} \CTAN-Archive, 1998, v2.5e.}
+%
+% \bibitem{yfonts}{\person{Schmidt, Walter:} \bibtitle{Ein Makropaket f\"ur die gebrochenen
+% Schriften.} \CTAN-Archive, 1998, v1.2.}
+%
+% \bibitem{Tschichold}{\person{Tschichold, Jan:} \bibtitle{Ausgew\"ahlte Aufs\"atze \"uber Fragen
+% der Gestalt des Buches und der Typographie.} Birkh\"auser, Basel,
+% 1987, 2nd~edition.}
+%
+% \bibitem{Willberg}{\person{Willberg, Hans Peter} and \person{Forssmann, Friedrich:}
+% \bibtitle{Lesetypographie.} H. Schmidt, Mainz, 1997.}
+%
+% \end{thebibliography}
+%
+%
+% \StopEventually{\addtocontents{toc}{\protect\end{multicols}}}
+%
+%
+%
+%
+%
+%
+%
+%
+%^^A max 72 columns
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \section{The implementation}
+%
+% \subsection*{The package preamble}
+%
+% This piece of code makes sure that the package is only loaded
+% once. While this is guaranteed by \LaTeX, we have to do it
+% manually for all other flavors of \TeX.
+%
+% \begin{macrocode}
+\expandafter\ifx\csname SOUL@\endcsname\relax\else
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% Fake some of the \LaTeX\ commands if we were loaded by another flavor
+% of \TeX. This might break some previously loaded packages, though,
+% if e.\,g.~\cs{\mbox} was already in use. But we don't care \dots
+%
+% \begin{macrocode}
+\ifx\documentclass\SOULundefined
+ \chardef\atcode=\catcode`@
+ \catcode`\@=11
+ \def\DeclareRobustCommand*{\def}
+ \let\newcommand\DeclareRobustCommand
+ \def\DeclareOption#1#2{\expandafter\def\csname#1\endcsname{#2}}
+ \def\PackageError#1#2#3{{%
+ \newlinechar`^^J%
+ \errorcontextlines\z@
+ \edef\\{\errhelp{#3}}\\%
+ \errmessage{Package #1 error: #2}%
+ }}
+ \def\@height{height}
+ \def\@depth{depth}
+ \def\@width{width}
+ \def\@plus{plus}
+ \def\@minus{minus}
+ \font\SOUL@tt=ectt1000
+ \let\@xobeysp\space
+ \let\linebreak\break
+ \let\mbox\hbox
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% \soul\ tries to be a good \LaTeX\ citizen if used under \LaTeX\ and
+% declares itself properly. Most command sequences in the package
+% are protected by the |SOUL@| namespace, all other macros are first
+% defined to be empty. This will give us an error message \emph{now}
+% if one of those was already used by another package.
+%
+% \begin{macrocode}
+\else
+ \NeedsTeXFormat{LaTeX2e}
+ \ProvidesPackage{soul}
+ [2003/11/17 v2.4 letterspacing/underlining (mf)]
+ \newfont\SOUL@tt{ectt1000}
+ \newcommand*\sodef{}
+ \newcommand*\resetso{}
+ \newcommand*\capsdef{}
+ \newcommand*\capsfont{}
+ \newcommand*\setulcolor{}
+ \newcommand*\setuloverlap{}
+ \newcommand*\setul{}
+ \newcommand*\resetul{}
+ \newcommand*\setuldepth{}
+ \newcommand*\setstcolor{}
+ \newcommand*\sethlcolor{}
+ \newcommand*\so{}
+ \newcommand*\ul{}
+ \newcommand*\st{}
+ \newcommand*\hl{}
+ \newcommand*\caps{}
+ \newcommand*\soulaccent{}
+ \newcommand*\soulregister{}
+ \newcommand*\soulfont{}
+ \newcommand*\soulomit{}
+\fi
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% Other packages wouldn't be happy if we reserved piles of \cs{\newtoks} and
+% \cs{\newdimen}, so we try to get away with their \cs{\...def} counterparts
+% where possible.
+% Local registers are always even, while global ones are odd---this is a
+% \TeX\ convention.
+%
+% \begin{macrocode}
+\newtoks\SOUL@word
+\newtoks\SOUL@lasttoken
+\toksdef\SOUL@syllable\z@
+\newtoks\SOUL@cmds
+\newtoks\SOUL@buffer
+\newtoks\SOUL@token
+\dimendef\SOUL@syllgoal\z@
+\dimendef\SOUL@syllwidth\tw@
+\dimendef\SOUL@charkern=4
+\dimendef\SOUL@hyphkern=6
+\countdef\SOUL@minus\z@
+\countdef\SOUL@comma\tw@
+\countdef\SOUL@apo=4
+\countdef\SOUL@grave=6
+\newskip\SOUL@spaceskip
+\newif\ifSOUL@ignorespaces
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% ^^A\FIXME{\newpage}
+% \begin{macro}{\soulomit}
+% \begin{macro}{\SOUL@ignorem}
+% \begin{macro}{\SOUL@ignore}
+% \begin{macro}{\SOUL@stopm}
+% \begin{macro}{\SOUL@stop}
+% \begin{macro}{\SOUL@relaxm}
+% \begin{macro}{\SOUL@lowerthanm}
+% \begin{macro}{\SOUL@hyphenhintm}
+% These macros are used as markers. To be able to check for such a
+% marker with \cs{\ifx} we have also to create a macro that contains
+% the marker. \cs{\SOUL@spc} shall contain a normal space with a
+% \cs{\catcode} of~10.
+%
+% \begin{macrocode}
+\def\soulomit#1{#1}
+\def\SOUL@stopM{\SOUL@stop}
+\let\SOUL@stop\relax
+\def\SOUL@lowerthan{}
+\def\SOUL@lowerthanM{\<}
+\def\SOUL@hyphenhintM{\-}
+\def\SOUL@n*{\let\SOUL@spc= }\SOUL@n* %
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The kernel}
+%
+% \begin{macro}{\SOUL@}
+% This macro is the entry to \soul. Using it does only make
+% sense after setting up a \soul\ driver. The next token after
+% the \soul\ command will be assigned to \cs{\SOUL@@}. This can be
+% some text enclosed in braces, or the name of a macro that contains text.
+%
+% \begin{macrocode}
+\def\SOUL@{%
+ \futurelet\SOUL@@\SOUL@expand
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@expand}
+% If the first token after the \soul\ command was an opening
+% brace we start scanning. Otherwise,
+% if the first token was a macro name, we expand that macro and
+% call \cs{\SOUL@} with its contents again. Unfortunately, we have to
+% exclude some macros therein from expansion.
+%
+% \begin{macrocode}
+\def\SOUL@expand{%
+ \ifcat\bgroup\noexpand\SOUL@@
+ \let\SOUL@n\SOUL@start
+ \else
+ \bgroup
+ \def\\##1##2{\def##2{\noexpand##2}}%
+ \the\SOUL@cmds
+ \SOUL@buffer={%
+ \\\TeX\\\LaTeX\\\soulomit\\\mbox\\\hbox\\\textregistered
+ \\\slash\\\textcircled\\\copyright\\\S\\\,\\\<\\\>\\~%
+ \\\\%
+ }%
+ \def\\##1{\def##1{\noexpand##1}}%
+ \the\SOUL@buffer
+ \let\protect\noexpand
+ \xdef\SOUL@n##1{\noexpand\SOUL@start{\SOUL@@}}%
+ \egroup
+ \fi
+ \SOUL@n
+}
+\long\def\SOUL@start#1{{%
+ \let\<\SOUL@lowerthan
+ \let\>\empty
+ \def\soulomit{\noexpand\soulomit}%
+ \gdef\SOUL@eventuallyexhyphen##1{}%
+ \let\SOUL@soeventuallyskip\relax
+ \SOUL@spaceskip=\fontdimen\tw@\font\@plus\fontdimen\thr@@\font
+ \@minus\fontdimen4\font
+ \SOUL@ignorespacesfalse
+ \leavevmode
+ \SOUL@preamble
+ \SOUL@lasttoken={}%
+ \SOUL@word={}%
+ \SOUL@minus\z@
+ \SOUL@comma\z@
+ \SOUL@apo\z@
+ \SOUL@grave\z@
+ \SOUL@do{#1}%
+ \SOUL@postamble
+}}
+\long\def\SOUL@do#1{%
+ \SOUL@scan#1\SOUL@stop
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The scanner}
+%
+% \begin{macro}{\SOUL@scan}
+% This is the entry point for the scanner. It calls \cs{\SOUL@eval}
+% and will in turn be called by \cs{\SOUL@eval} again for every
+% new token to be scanned.
+%
+% \begin{macrocode}
+\def\SOUL@scan{%
+ \futurelet\SOUL@@\SOUL@eval
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@eval}
+% And here it is: the scanner's heart. It cares for quotes and dashes
+% ligatures and handles all commands that must not be fed to the
+% analyzer.
+%
+% \begin{macrocode}
+\def\SOUL@eval{%
+ \def\SOUL@n*##1{\SOUL@scan}%
+ \if\noexpand\SOUL@@\SOUL@spc
+ \else
+ \SOUL@ignorespacesfalse
+ \fi
+ \ifnum\SOUL@minus=\thr@@
+ \SOUL@flushminus
+ \else\ifnum\SOUL@comma=\tw@
+ \SOUL@flushcomma
+ \else\ifnum\SOUL@apo=\tw@
+ \SOUL@flushapo
+ \else\ifnum\SOUL@grave=\tw@
+ \SOUL@flushgrave
+ \fi\fi\fi\fi
+ \ifx\SOUL@@-\else\SOUL@flushminus\fi
+ \ifx\SOUL@@,\else\SOUL@flushcomma\fi
+ \ifx\SOUL@@'\else\SOUL@flushapo\fi
+ \ifx\SOUL@@`\else\SOUL@flushgrave\fi
+ \ifx\SOUL@@-%
+ \advance\SOUL@minus\@ne
+ \else\ifx\SOUL@@,%
+ \advance\SOUL@comma\@ne
+ \else\ifx\SOUL@@'%
+ \advance\SOUL@apo\@ne
+ \else\ifx\SOUL@@`%
+ \advance\SOUL@grave\@ne
+ \else
+ \SOUL@flushminus
+ \SOUL@flushcomma
+ \SOUL@flushapo
+ \SOUL@flushgrave
+ \ifx\SOUL@@\SOUL@stop
+ \def\SOUL@n*{%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ }%
+ \else\ifx\SOUL@@\par
+ \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
+ \else\if\noexpand\SOUL@@\SOUL@spc
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \ifSOUL@ignorespaces
+ \else
+ \SOUL@everyspace{}%
+ \fi
+ \def\SOUL@n* {\SOUL@scan}%
+ \else\ifx\SOUL@@\\%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\unskip\nobreak\hfil\break}%
+ \SOUL@ignorespacestrue
+ \else\ifx\SOUL@@~%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \else\ifx\SOUL@@\slash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{/}%
+ \SOUL@exhyphen{/}%
+ \else\ifx\SOUL@@\mbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\hbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\soulomit
+ \def\SOUL@n*\soulomit##1{%
+ \SOUL@doword
+ {\spaceskip\SOUL@spaceskip##1}%
+ \SOUL@scan
+ }%
+ \else\ifx\SOUL@@\break
+ \SOUL@doword
+ \break
+ \else\ifx\SOUL@@\linebreak
+ \SOUL@doword
+ \SOUL@everyspace{\linebreak}%
+ \else\ifcat\bgroup\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addgroup{}}%
+ \else\ifcat$\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addmath}%
+ \else
+ \def\SOUL@n*{\SOUL@dotoken}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi
+ \SOUL@n*%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@flushminus}
+% \begin{macro}{\SOUL@flushcomma}
+% \begin{macro}{\SOUL@flushapo}
+% \begin{macro}{\SOUL@flushgrave}
+% As their names imply, these macros flush special tokens or token
+% groups to the word register. They don't do anything if the respective
+% counter equals zero. \cs{\SOUL@minus} does also flush the word
+% register, because hyphens disturb the analyzer.
+%
+% \begin{macrocode}
+\def\SOUL@flushminus{%
+ \ifcase\SOUL@minus
+ \else
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{-}%
+ \ifcase\SOUL@minus
+ \or
+ \SOUL@exhyphen{-}%
+ \or
+ \SOUL@exhyphen{--}%
+ \or
+ \SOUL@exhyphen{---}%
+ \fi
+ \SOUL@minus\z@
+ \fi
+}
+\def\SOUL@flushcomma{%
+ \ifcase\SOUL@comma
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word,}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
+ \fi
+ \SOUL@comma\z@
+}
+\def\SOUL@flushapo{%
+ \ifcase\SOUL@apo
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word'}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
+ \fi
+ \SOUL@apo\z@
+}
+\def\SOUL@flushgrave{%
+ \ifcase\SOUL@grave
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word`}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
+ \fi
+ \SOUL@grave\z@
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@dotoken}
+% Command sequences from the \cs{\SOUL@cmds} list are handed over
+% to \cs{\SOUL@docmd}, everything else is added to \cs{\SOUL@word},
+% which will be fed to the analyzer every time a word is completed.
+% Since \emph{robust} commands come with an additional space, we
+% have also to examine if there's a space variant. Otherwise we
+% couldn't detect pre-expanded formerly robust commands.
+%
+% \begin{macrocode}
+\def\SOUL@dotoken#1{%
+ \def\SOUL@@{\SOUL@addtoken{#1}}%
+ \def\\##1##2{%
+ \edef\SOUL@x{\string#1}%
+ \edef\SOUL@n{\string##2}%
+ \ifx\SOUL@x\SOUL@n
+ \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
+ \else
+ \edef\SOUL@n{\string##2\space}%
+ \ifx\SOUL@x\SOUL@n
+ \def\SOUL@@{\SOUL@docmd{##1}{#1}}%
+ \fi
+ \fi
+ }%
+ \the\SOUL@cmds
+ \SOUL@@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@docmd}
+% Here we deal with commands that were registered with \cs{\soulregister}
+% or \cs{\soulaccent} or were already predefined in \cs{\SOUL@cmds}.
+% Commands with identifier |9| are accents that are put in a
+% group with their argument. Identifier |8| is reserved for the \cs{\footnote}
+% command, and |7| for the \cs{\textsuperscript} or similar commands.
+% The others are mostly (but not necessarily)
+% font switching commands, which may (|1|) or may not (|0|) take
+% an argument. A registered command leads to the current word
+% buffer being flushed to the analyzer, after which the command
+% itself is executed.
+%
+% Font switching commands which take an argument need special
+% treatment: They need to increment the level counter, so that
+% \cs{\SOUL@eval} knows where to stop scanning. Furthermore the
+% scanner has to be enabled to see the next token after the opening
+% brace.
+%
+%
+% \begin{macrocode}
+\def\SOUL@docmd#1#2{%
+ \ifx9#1%
+ \def\SOUL@@{\SOUL@addgroup{#2}}%
+ \else\ifx8#1%
+ \SOUL@doword
+ \def\SOUL@@##1{%
+ \SOUL@token={\footnotemark}%
+ \SOUL@everytoken
+ \SOUL@syllable={\footnotemark}%
+ \SOUL@everysyllable
+ \footnotetext{##1}%
+ \SOUL@doword
+ \SOUL@scan
+ }%
+ \else\ifx7#1%
+ \SOUL@doword
+ \def\SOUL@@##1{%
+ \SOUL@token={#2{##1}}%
+ \SOUL@everytoken
+ \SOUL@syllable={#2{##1}}%
+ \SOUL@everysyllable
+ \SOUL@doword
+ \SOUL@scan
+ }%
+ \else\ifx1#1%
+ \SOUL@doword
+ \def\SOUL@@##1{%
+ #2{\protect\SOUL@do{##1}}%
+ \SOUL@scan
+ }%
+ \else
+ \SOUL@doword
+ #2%
+ \let\SOUL@@\SOUL@scan
+ \fi\fi\fi\fi
+ \SOUL@@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@addgroup}
+% \begin{macro}{\SOUL@addmath}
+% \begin{macro}{\SOUL@addprotect}
+% \begin{macro}{\SOUL@addtoken}
+% The macro names say it all. Each of these macros adds some
+% token to the word buffer \cs{\SOUL@word}. Setting \cs{\protect}
+% is necessary to make things like |\so{{a\itshape b}}| work.
+%
+% \begin{macrocode}
+\def\SOUL@addgroup#1#2{%
+ {\let\protect\noexpand
+ \edef\x{\global\SOUL@word={\the\SOUL@word{{\noexpand#1#2}}}}\x}%
+ \SOUL@scan
+}
+\def\SOUL@addmath$#1${%
+ {\let\protect\noexpand
+ \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{$#1$}}}}}\x}%
+ \SOUL@scan
+}
+\def\SOUL@addprotect#1#2{%
+ {\let\protect\noexpand
+ \edef\x{\global\SOUL@word={\the\SOUL@word{{\hbox{#2}}}}}\x}%
+ \SOUL@scan
+}
+\def\SOUL@addtoken#1{%
+ \edef\x{\SOUL@word={\the\SOUL@word\noexpand#1}}\x
+ \SOUL@scan
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@exhyphen}
+% Dealing with explicit hyphens can't be done before we know the
+% following character, because we need to know if a kerning value
+% has to be inserted, hence we delay the \cs{\SOUL@everyexhyphen} call.
+% Unfortunately, the word scanner has no look-ahead mechanism.
+%
+% \begin{macrocode}
+\def\SOUL@exhyphen#1{%
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}{#1}%
+ \gdef\SOUL@eventuallyexhyphen##1{%
+ \SOUL@getkern{#1}{\SOUL@charkern}{##1}%
+ \SOUL@everyexhyphen{#1}%
+ \gdef\SOUL@eventuallyexhyphen####1{}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@cmds}
+% Here is a list of pre-registered commands that the analyzer
+% cannot handle, so the scanner has to look after them. Every
+% entry consists of a handle (\cs{\\}), an identifier and the
+% macro name. The class identifier can be |9| for accents,
+% |8| for the \cs{\footnote} command, |7| for the
+% \cs{\textsuperscript} command,
+% |0| for commands without arguments and |1| for commands that
+% take one argument. Commands with two or more arguments are
+% not supported.
+%
+% \begin{macrocode}
+\SOUL@cmds={%
+ \\9\`\\9\'\\9\^\\9\"\\9\~\\9\=\\9\.%
+ \\9\u\\9\v\\9\H\\9\t\\9\c\\9\d\\9\b\\9\r
+ \\1\emph\\1\textrm\\1\textsf\\1\texttt\\1\textmd\\1\textbf
+ \\1\textup\\1\textsl\\1\textit\\1\textsc\\1\textnormal
+ \\0\rmfamily\\0\sffamily\\0\ttfamily\\0\mdseries\\0\upshape
+ \\0\slshape\\0\itshape\\0\scshape\\0\normalfont
+ \\0\em\\0\rm\\0\bf\\0\it\\0\tt\\0\sc\\0\sl\\0\sf
+ \\0\tiny\\0\scriptsize\\0\footnotesize\\0\small
+ \\0\normalsize\\0\large\\0\Large\\0\LARGE\\0\huge\\0\Huge
+ \\1\MakeUppercase\\7\textsuperscript\\8\footnote
+ \\1\textfrak\\1\textswab\\1\textgoth
+ \\0\frakfamily\\0\swabfamily\\0\gothfamily
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\soulregister}
+% \begin{macro}{\soulfont}
+% \begin{macro}{\soulaccent}
+% Register a font switching command (or some other command) for the
+% scanner. The first argument is the macro name, the second is
+% the number of arguments (|0|~or~|1|). Example: |\soulregister{\bold}{0}|.
+% \cs{\soulaccent} has only one argument---the accent macro name.
+% Example: |\soulaccent{\~}|. It is a shortcut for |\soulregister{\~}{9}|.
+% The \cs{\soulfont} command is a synonym for \cs{\soulregister}
+% and is kept for compatibility reasons.
+%
+% \begin{macrocode}
+\def\soulregister#1#2{{%
+ \edef\x{\global\SOUL@cmds={\the\SOUL@cmds
+ \noexpand\\#2\noexpand#1}}\x
+}}
+\def\soulaccent#1{\soulregister{#1}9}
+\let\soulfont\soulregister
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The analyzer}
+%
+% \begin{macro}{\SOUL@doword}
+% The only way to find out, where a given word can be broken into
+% syllables, is to let \TeX\ actually typeset the word under conditions
+% that enforce every possible hyphenation. The result is a paragraph with one
+% line for every syllable.
+%
+% \begin{macrocode}
+\def\SOUL@doword{%
+ \edef\x{\the\SOUL@word}%
+ \ifx\x\empty
+ \else
+ \SOUL@buffer={}%
+ \setbox\z@\vbox{%
+ \SOUL@tt
+ \hyphenchar\font`\-
+ \hfuzz\maxdimen
+ \hbadness\@M
+ \pretolerance\m@ne
+ \tolerance\@M
+ \leftskip\z@
+ \rightskip\z@
+ \hsize1sp
+ \everypar{}%
+ \parfillskip\z@\@plus1fil
+ \hyphenpenalty-\@M
+ \noindent
+ \hskip\z@
+ \relax
+ \the\SOUL@word}%
+ \let\SOUL@errmsg\SOUL@error
+ \let\-\relax
+ \count@\m@ne
+ \SOUL@analyze
+ \SOUL@word={}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% We store the hyphen width of the |ectt1000| font,
+% because we will need it in |\SOUL@doword|. (|ectt1000| is a mono-spaced
+% font, so every other character would have worked, too.)
+%
+% \begin{macrocode}
+\setbox\z@\hbox{\SOUL@tt-}
+\newdimen\SOUL@ttwidth
+\SOUL@ttwidth\wd\z@
+\def\SOUL@sethyphenchar{%
+ \ifnum\hyphenchar\font=\m@ne
+ \else
+ \char\hyphenchar\font
+ \fi
+}
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@analyze}
+% This macro decomposes the box that |\SOUL@doword| has built.
+% Because we have to start at the bottom, we put every
+% syllable onto the stack and execute ourselves recursively. If there
+% are no syllables left, we return from the recursion and pick syllable
+% after syllable from the stack again---this time from top to bottom---and
+% hand the syllable width |\SOUL@syllgoal| over to |\SOUL@dosyllable|.
+% All but the last syllable end with the hyphen character, hence
+% we subtract the hyphen width accordingly. After processing a
+% syllable we calculate the hyphen kern (i.\,e.~the kerning amount
+% between the last character and the hyphen). This might be needed
+% by \cs{\SOUL@everyhyphen}, which we call now.
+%
+% \begin{macrocode}
+\def\SOUL@analyze{{%
+ \setbox\z@\vbox{%
+ \unvcopy\z@
+ \unskip
+ \unpenalty
+ \global\setbox\@ne=\lastbox}%
+ \ifvoid\@ne
+ \else
+ \setbox\@ne\hbox{\unhbox\@ne}%
+ \SOUL@syllgoal=\wd\@ne
+ \advance\count@\@ne
+ \SOUL@analyze
+ \SOUL@syllwidth\z@
+ \SOUL@syllable={}%
+ \ifnum\count@>\z@
+ \advance\SOUL@syllgoal-\SOUL@ttwidth
+ \SOUL@dosyllable
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@hyphkern}%
+ {\SOUL@sethyphenchar}%
+ \SOUL@everyhyphen
+ \else
+ \SOUL@dosyllable
+ \fi
+ \fi
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@dosyllable}
+% This macro typesets token after token from \cs{\SOUL@word}
+% until \cs{\SOUL@syllwidth} has reached
+% the requested width \cs{\SOUL@syllgoal}. Furthermore the kerning
+% values are prepared in case \cs{\SOUL@everytoken} needs them.
+% The \cs{\<} command used by \cs{\so} and \cs{\caps} needs some
+% special treatment: It has to be checked for, even before
+% we can end a syllable.
+%
+% \begin{macrocode}
+\def\SOUL@dosyllable{%
+ \SOUL@gettoken
+ \SOUL@eventuallyexhyphen{\the\SOUL@token}%
+ \edef\x{\the\SOUL@token}%
+ \ifx\x\SOUL@hyphenhintM
+ \let\SOUL@n\SOUL@dosyllable
+ \else\ifx\x\SOUL@lowerthanM
+ \SOUL@gettoken
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
+ {\the\SOUL@token}%
+ \SOUL@everylowerthan
+ \SOUL@puttoken
+ \let\SOUL@n\SOUL@dosyllable
+ \else\ifdim\SOUL@syllwidth=\SOUL@syllgoal
+ \SOUL@everysyllable
+ \SOUL@puttoken
+ \let\SOUL@n\relax
+ \else\ifx\x\SOUL@stopM
+ \SOUL@errmsg
+ \global\let\SOUL@errmsg\relax
+ \let\SOUL@n\relax
+ \else
+ \setbox\tw@\hbox{\SOUL@tt\the\SOUL@token}%
+ \advance\SOUL@syllwidth\wd\tw@
+ \global\SOUL@lasttoken=\SOUL@token
+ \SOUL@gettoken
+ \SOUL@getkern{\the\SOUL@lasttoken}{\SOUL@charkern}
+ {\the\SOUL@token}%
+ \SOUL@puttoken
+ \global\SOUL@token=\SOUL@lasttoken
+ \SOUL@everytoken
+ \edef\x{\SOUL@syllable={\the\SOUL@syllable\the\SOUL@token}}\x
+ \let\SOUL@n\SOUL@dosyllable
+ \fi\fi\fi\fi
+ \SOUL@n
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@gettoken}
+% Provide the next token in \cs{\SOUL@token}. If there's already one
+% in the buffer, use that one first.
+%
+% \begin{macrocode}
+\def\SOUL@gettoken{%
+ \edef\x{\the\SOUL@buffer}%
+ \ifx\x\empty
+ \SOUL@nexttoken
+ \else
+ \global\SOUL@token=\SOUL@buffer
+ \global\SOUL@buffer={}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@puttoken}
+% The possibility to put tokens back makes the scanner design much
+% cleaner. There's only room for one token, though, so we issue
+% an error message if \cs{\SOUL@puttoken} is told to put a token
+% back while the buffer is still in use. Note that \cs{\SOUL@debug}
+% is actually undefined. This won't hurt as it can only happen
+% during driver design. No user will ever see this message.
+%
+% \begin{macrocode}
+\def\SOUL@puttoken{%
+ \edef\x{\the\SOUL@buffer}%
+ \ifx\x\empty
+ \global\SOUL@buffer=\SOUL@token
+ \global\SOUL@token={}%
+ \else
+ \SOUL@debug{puttoken called twice}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@nexttoken}
+% \begin{macro}{\SOUL@splittoken}
+% If the word buffer \cs{\SOUL@word} is empty, deliver a \cs{\SOUL@stop},
+% otherwise take the next token.
+%
+% \begin{macrocode}
+\def\SOUL@nexttoken{%
+ \edef\x{\the\SOUL@word}%
+ \ifx\x\empty
+ \SOUL@token={\SOUL@stop}%
+ \else
+ \expandafter\SOUL@splittoken\the\SOUL@word\SOUL@stop
+ \fi
+}
+\def\SOUL@splittoken#1#2\SOUL@stop{%
+ \global\SOUL@token={#1}%
+ \global\SOUL@word={#2}%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@getkern}
+% Assign the kerning value between the first and the third argument
+% to the second, which has to be a \cs{\dimen} register.
+% |\SOUL@getkern{A}{\dimen0}{V}| will assign the kerning value
+% between `A' and `V' to |\dimen0|.
+%
+% \begin{macrocode}
+\def\SOUL@getkern#1#2#3{%
+ \setbox\tw@\hbox{#1#3}%
+ #2\wd\tw@
+ \setbox\tw@\hbox{#1\null#3}%
+ \advance#2-\wd\tw@
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@setkern}
+% Set a kerning value if it doesn't equal 0\,pt. Of course, we could
+% also set a zero value, but that would needlessly clutter the
+% logfile.
+%
+% \begin{macrocode}
+\def\SOUL@setkern#1{\ifdim#1=\z@\else\kern#1\fi}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@error}
+% This error message will be shown once for every word that couldn't
+% be reconstructed by \cs{\SOUL@dosyllable}.
+%
+% \begin{macrocode}
+\def\SOUL@error{%
+ \vrule\@height.8em\@depth.2em\@width1em
+ \PackageError{soul}{Reconstruction failed}{%
+ I came across hyphenatable material enclosed in group
+ braces,^^Jwhich I can't handle. Either drop the braces or
+ make the material^^Junbreakable using an \string\mbox\space
+ (\string\hbox). Note that a space^^Jalso counts as possible
+ hyphenation point. See page 4 of the manual.^^JI'm leaving
+ a black square so that you can see where I am right now.%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@setup}
+% This is a null driver, that will be used as the basis for
+% other drivers. These have then to redefine only interface commands
+% that shall differ from the default.
+%
+% \begin{macrocode}
+\def\SOUL@setup{%
+ \let\SOUL@preamble\relax
+ \let\SOUL@postamble\relax
+ \let\SOUL@everytoken\relax
+ \let\SOUL@everysyllable\relax
+ \def\SOUL@everyspace##1{##1\space}%
+ \let\SOUL@everyhyphen\relax
+ \def\SOUL@everyexhyphen##1{##1}%
+ \let\SOUL@everylowerthan\relax
+}
+\SOUL@setup
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The \texorpdfstring{\so{letterspacing}}{letterspacing} driver}
+%
+% \begin{macro}{\SOUL@sosetletterskip}
+% A handy helper macro that sets the inter-letter skip with a
+% draconian \cs{\penalty}.
+%
+% \begin{macrocode}
+\def\SOUL@sosetletterskip{\nobreak\hskip\SOUL@soletterskip}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@sopreamble}
+% If letterspacing (\cs{\so} or \cs{\caps}) follows a white space, we
+% replace it with our \syn{outer space}. \LaTeX\ uses |\hskip1sp| as
+% marker in tabular entries, so we ignore tiny skips.
+%
+% \begin{macrocode}
+\def\SOUL@sopreamble{%
+ \ifdim\lastskip>5sp
+ \unskip
+ \hskip\SOUL@soouterskip
+ \fi
+ \spaceskip\SOUL@soinnerskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@sopostamble}
+% Start the look-ahead scanner \cs{\SOUL@socheck} outside the \cs{\SOUL@}
+% scope. That's why we make the \syn{outer space} globally available in
+% \cs{\skip@}.
+%
+% \begin{macrocode}
+\def\SOUL@sopostamble{%
+ \global\skip@=\SOUL@soouterskip
+ \aftergroup\SOUL@socheck
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@socheck}
+% \begin{macro}{\SOUL@sodoouter}
+% Read the next token after the \soul\ command into \cs{\SOUL@@}
+% and examine it. If it's some kind of space, replace it with
+% \syn{outer space} and the appropriate penalty, else if it's
+% a closing brace, continue scanning. If it is neither: do nothing.
+%
+% \begin{macrocode}
+\def\SOUL@socheck{%
+ \futurelet\SOUL@@\SOUL@sodoouter
+}
+\def\SOUL@sodoouter{%
+ \def\SOUL@n*##1{\hskip\skip@}%
+ \ifcat\egroup\noexpand\SOUL@@
+ \unkern
+ \egroup
+ \def\SOUL@n*{\afterassignment\SOUL@socheck\let\SOUL@x=}%
+ \else\ifx\SOUL@spc\SOUL@@
+ \def\SOUL@n* {\hskip\skip@}%
+ \else\ifx~\SOUL@@
+ \def\SOUL@n*~{\nobreak\hskip\skip@}%
+ \else\ifx\ \SOUL@@
+ \else\ifx\space\SOUL@@
+ \else\ifx\@xobeysp\SOUL@@
+ \else
+ \def\SOUL@n*{}%
+ \let\SOUL@@\relax
+ \fi\fi\fi\fi\fi\fi
+ \SOUL@n*%
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeverytoken}
+% Typeset the token and put an unbreakable inter-letter skip
+% thereafter. If the token is \cs{\<} then remove the last skip instead.
+% Gets the character kerning value between the actual and the
+% next token in \cs{\SOUL@charkern}.
+%
+% \begin{macrocode}
+\def\SOUL@soeverytoken{%
+ \edef\x{\the\SOUL@token}%
+ \ifx\x\SOUL@lowerthanM
+ \else
+ \global\let\SOUL@soeventuallyskip\SOUL@sosetletterskip
+ \the\SOUL@token
+ \SOUL@gettoken
+ \edef\x{\the\SOUL@token}%
+ \ifx\x\SOUL@stopM
+ \else
+ \SOUL@setkern\SOUL@charkern
+ \SOUL@sosetletterskip
+ \SOUL@puttoken
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeveryspace}
+% This macro sets an \syn{inner space}. The argument may contain
+% penalties and is used for the |~| command. This construction was
+% needed to make colored underlines work, without having to put
+% any of the coloring commands into the core. |\kern\z@| prevents
+% in subsequent \cs{\so} commands that the second discards the
+% \syn{outer space} of the first. To remove the space simply
+% use |\unkern\unskip|.
+%
+% \begin{macrocode}
+\def\SOUL@soeveryspace#1{#1\space\kern\z@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeveryhyphen}
+% Sets implicit hyphens. The kerning value between the current token
+% and the hyphen character is passed in \cs{\SOUL@hyphkern}.
+%
+% \begin{macrocode}
+\def\SOUL@soeveryhyphen{%
+ \discretionary{%
+ \unkern
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@sethyphenchar
+ }{}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeveryexhyphen}
+% Sets the explicit hyphen that is passed as argument.
+% \cs{\SOUL@soeventuallyskip} equals \cs{\SOUL@sosetletterskip},
+% except when a \cs{\<} had been detected. This is necessary because
+% \cs{\SOUL@soeveryexhyphen} wouldn't know otherwise, that it
+% follows a~\cs{\<}.
+%
+% \begin{macrocode}
+\def\SOUL@soeveryexhyphen#1{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@soeventuallyskip
+ \hbox{#1}%
+ \discretionary{}{}{%
+ \SOUL@setkern\SOUL@charkern
+ }%
+ \SOUL@sosetletterskip
+ \global\let\SOUL@soeventuallyskip\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@soeverylowerthan}
+% Let \cs{\<} remove the last inter-letter skip. Set the kerning value
+% between the token before and that after the \cs{\<} command.
+%
+%
+% \begin{macrocode}
+\def\SOUL@soeverylowerthan{%
+ \unskip
+ \unpenalty
+ \global\let\SOUL@soeventuallyskip\relax
+ \SOUL@setkern\SOUL@charkern
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@sosetup}
+% Override all interface macros by our letterspacing versions. The
+% only unused macro is \cs{\SOUL@everysyllable}.
+%
+% \begin{macrocode}
+\def\SOUL@sosetup{%
+ \SOUL@setup
+ \let\SOUL@preamble\SOUL@sopreamble
+ \let\SOUL@postamble\SOUL@sopostamble
+ \let\SOUL@everytoken\SOUL@soeverytoken
+ \let\SOUL@everyspace\SOUL@soeveryspace
+ \let\SOUL@everyhyphen\SOUL@soeveryhyphen
+ \let\SOUL@everyexhyphen\SOUL@soeveryexhyphen
+ \let\SOUL@everylowerthan\SOUL@soeverylowerthan
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@setso}
+% A handy macro for internal use.
+%
+% \begin{macrocode}
+\def\SOUL@setso#1#2#3{%
+ \def\SOUL@soletterskip{#1}%
+ \def\SOUL@soinnerskip{#2}%
+ \def\SOUL@soouterskip{#3}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\sodef}
+% This macro assigns the letterspacing skips as well as an optional
+% font switching command to a command sequence name. \cs{\so} itself
+% will be defined using this macro.
+%
+% \begin{macrocode}
+\def\sodef#1#2#3#4#5{%
+ \DeclareRobustCommand*#1{\SOUL@sosetup
+ \def\SOUL@preamble{%
+ \SOUL@setso{#3}{#4}{#5}%
+ #2%
+ \SOUL@sopreamble
+ }%
+ \SOUL@
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\resetso}
+% Let \cs{\resetso} define reasonable default values for letterspacing.
+%
+% \begin{macrocode}
+\def\resetso{%
+ \sodef\textso{}{.25em}{.65em\@plus.08em\@minus.06em}%
+ {.55em\@plus.275em\@minus.183em}%
+}
+\resetso
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\sloppyword}
+% Set up a letterspacing macro that inserts slightly stretchable
+% space between the characters. This can be used to typeset long
+% words in narrow columns, where ragged paragraphs are undesirable.
+% See section~\ref{sec:sloppyword}.
+%
+% \begin{macrocode}
+\sodef\sloppyword{%
+ \linepenalty10
+ \hyphenpenalty10
+ \adjdemerits\z@
+ \doublehyphendemerits\z@
+ \finalhyphendemerits\z@
+ \emergencystretch.1em}%
+ {\z@\@plus.1em}%
+ {.33em\@plus.11em\@minus.11em}%
+ {.33em\@plus.11em\@minus.11em}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection[The \texorpdfstring{\caps{caps}}{caps} driver]{The caps driver}
+%
+% \begin{macro}{\caps}
+% Unless run under \LaTeX, make \cs{\caps} just another simple letterspacing
+% macro that selects a font \cs{\capsfont} (defaulting to \cs{\relax}) but
+% doesn't have any special capabilities.
+%
+% \begin{macrocode}
+\ifx\documentclass\@undefined
+\let\capsfont\relax
+\let\capsreset\relax
+\def\capsdef#1#2#3#4#5{}
+\def\capssave#1{}
+\def\capsselect#1{}
+\sodef\textcaps{\capsfont}
+ {.028em\@plus.005em\@minus.01em}%
+ {.37em\@plus.1667em\@minus.111em}%
+ {.37em\@plus.1em\@minus.14em}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\capsreset}
+% \dots\ else, if run under \LaTeX\ prepare a set of macros that
+% maintain a database with certain letterspacing values for different
+% fonts. \cs{\capsreset} clears the database and inserts a default rule.
+%
+% \begin{macrocode}
+\else
+\DeclareRobustCommand*\capsreset{%
+ \let\SOUL@capsbase\empty
+ \SOUL@capsdefault
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\capsdef}
+% Add an entry to the database, which is of course nothing else than
+% a \TeX\ macro. See section ``List macros'' of appendix~D in the
+% \TeX{}book~\cite{DEK} for details.
+%
+% \begin{macrocode}
+\def\capsdef#1#2#3#4#5{{%
+ \toks\z@{\\{#1/#2/#3/#4/#5}}%
+ \toks\tw@=\expandafter{\SOUL@capsbase}%
+ \xdef\SOUL@capsbase{\the\toks\z@\the\toks\tw@}%
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\capssave}
+% \begin{macro}{\capsselect}
+% Save the current database in a macro within the |SOUL@| namespace
+% and let |\capsselect| restore this database.
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\capssave[1]{%
+ \expandafter\global\expandafter\let
+ \csname SOUL@db@#1\endcsname\SOUL@capsbase
+}
+\DeclareRobustCommand*\capsselect[1]{%
+ \expandafter\let\expandafter\SOUL@capsbase
+ \csname SOUL@db@#1\endcsname
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@capsfind}
+% \begin{macro}{\SOUL@caps}
+% Go through the database entries and pick the first entry that matches
+% the currently active font. Then define an internal macro that uses
+% the respective spacing values in a macro that is equivalent to the
+% \cs{\textso} command.
+%
+% \begin{macrocode}
+\def\SOUL@capsfind#1/#2/#3/#4/#5/#6/#7/#8/#9/{%
+ \let\SOUL@match=1%
+ \SOUL@chk{#1}\f@encoding
+ \SOUL@chk{#2}\f@family
+ \SOUL@chk{#3}\f@series
+ \SOUL@chk{#4}\f@shape
+ \SOUL@dimchk{#5}\f@size
+ \if\SOUL@match1%
+ \let\\\@gobble
+ \gdef\SOUL@caps{%
+ \SOUL@sosetup
+ \def\SOUL@preamble{\SOUL@setso{#7}{#8}{#9}#6%
+ \SOUL@sopreamble}%
+ \SOUL@}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@chk}
+% Sets the \cs{\SOUL@match} flag if both parameters are equal.
+% This is used for all \caps{\small NFSS} elements except the font size.
+%
+% \begin{macrocode}
+\def\SOUL@chk#1#2{%
+ \if$#1$%
+ \else
+ \def\SOUL@n{#1}%
+ \ifx#2\SOUL@n\else\let\SOUL@match=0\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@dimchk}
+% \begin{macro}{\SOUL@rangechk}
+% We do not only want to check if a given font size |#1| matches |#2|,
+% but also if it fits into a given range. An omitted lower boundary
+% is replaced by \cs{\z@} and an omitted upper boundary by \cs{\maxdimen}.
+% The first of a series of \cs{\SOUL@chk} and \cs{\SOUL@dimchk}
+% statements, which detects that the arguments don't match, sets the
+% \cs{\SOUL@match} flag to zero. A value of~1 indicates that an
+% entry in the font database matches the currently used font.
+%
+% \begin{macrocode}
+\def\SOUL@dimchk#1#2{\if$#1$\else\SOUL@rangechk{#2}#1--\@ne\@@\fi}
+\def\SOUL@rangechk#1#2-#3-#4\@@{%
+ \count@=#4%
+ \ifnum\count@>\z@
+ \ifdim#1\p@=#2\p@\else\let\SOUL@match=0\fi
+ \else
+ \dimen@=\if$#2$\z@\else#2\p@\fi
+ \ifdim#1\p@<\dimen@\let\SOUL@match=0\fi
+ \dimen@=\if$#3$\maxdimen\else#3\p@\fi
+ \ifdim#1\p@<\dimen@\else\let\SOUL@match=0\fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\textcaps}
+% Find a matching entry in the database and start the letterspacing
+% mechanism with the given spacing values.
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\textcaps{{%
+ \def\\##1{\expandafter\SOUL@capsfind##1/}%
+ \SOUL@capsbase
+ \aftergroup\SOUL@caps
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@capsdefault}
+% Define a default database entry and a default font.
+%
+% \begin{macrocode}
+\def\SOUL@capsdefault{%
+ \capsdef{////}%
+ \SOUL@capsdfltfnt
+ {.028em\@plus.005em\@minus.01em}%
+ {.37em\@plus.1667em\@minus.1em}%
+ {.37em\@plus.111em\@minus.14em}%
+}
+\let\SOUL@capsdfltfnt\scshape
+\capsreset
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The \texorpdfstring{\ul{underlining}}{underlining} driver}
+%
+% \begin{macro}{\SOUL@ulleaders}
+% This macro sets the underline under the following \cs{\hskip}.
+%
+% \begin{macrocode}
+\newdimen\SOUL@uldp
+\newdimen\SOUL@ulht
+\def\SOUL@ulleaders{%
+ \leaders\hrule\@depth\SOUL@uldp\@height\SOUL@ulht\relax
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulunderline}
+% Set an underline under the given material. It draws the line first,
+% and the given material afterwards. This is needed for highlighting,
+% but gives less than optimal results for colored overstriking, which,
+% however, will hardly ever be used, anyway.
+%
+% \begin{macrocode}
+\def\SOUL@ulunderline#1{{%
+ \setbox\z@\hbox{#1}%
+ \dimen@=\wd\z@
+ \dimen@i=\SOUL@uloverlap
+ \advance\dimen@2\dimen@i
+ \rlap{%
+ \null
+ \kern-\dimen@i
+ \SOUL@ulcolor{\SOUL@ulleaders\hskip\dimen@}%
+ }%
+ \unhcopy\z@
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulpreamble}
+% Just set up the line dimensions and the space skip. Normally,
+% \cs{\spaceskip} is unset and not used by \TeX. We need it, though,
+% because we feed it to the \cs{\leaders} primitive.
+%
+% \begin{macrocode}
+\def\SOUL@ulpreamble{%
+ \SOUL@uldp=\SOUL@uldepth
+ \SOUL@ulht=-\SOUL@uldp
+ \advance\SOUL@uldp\SOUL@ulthickness
+ \spaceskip\SOUL@spaceskip
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleverysyllable}
+% By using \cs{\SOUL@everysyllable} we don't have to care about
+% kerning values and get better results for highlighting, where
+% negative kerning values would otherwise cut off characters.
+%
+% \begin{macrocode}
+\def\SOUL@uleverysyllable{%
+ \SOUL@ulunderline{%
+ \the\SOUL@syllable
+ \SOUL@setkern\SOUL@charkern
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleveryspace}
+% Set a given penalty and an underlined \cs{\space} equivalent.
+% The \cs{\null} prevents a nasty gap in |\textfrak| |{a \textswab{b}}|,
+% while it doesn't seem to hurt in all other cases. I didn't investigate
+% this.
+%
+% \begin{macrocode}
+\def\SOUL@uleveryspace#1{%
+ \SOUL@ulcolor{%
+ #1%
+ \SOUL@ulleaders
+ \hskip\spaceskip
+ }%
+ \null
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleveryhyphen}
+% If hyphenation takes place, output an underlined hyphen with the
+% required hyphen kerning value.
+%
+% \begin{macrocode}
+\def\SOUL@uleveryhyphen{%
+ \discretionary{%
+ \unkern
+ \SOUL@ulunderline{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@sethyphenchar
+ }%
+ }{}{}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@uleveryexhyphen}
+% Underline the given hyphen, en-dash, em-dash or \cs{\slash} and care
+% for kerning.
+%
+% \begin{macrocode}
+\def\SOUL@uleveryexhyphen#1{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@ulunderline{#1}%
+ \discretionary{}{}{%
+ \SOUL@setkern\SOUL@charkern
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulcolor}
+% \begin{macro}{\setulcolor}
+% Define the underline color or turn off coloring, in which case the lines are not
+% just colored black, but remain uncolored. This makes them appear
+% black, nevertheless, and has the advantage, that no Postscript
+% \cs{\specials} are cluttering the output.
+%
+% \begin{macrocode}
+\let\SOUL@ulcolor\relax
+\def\setulcolor#1{%
+ \if$#1$
+ \let\SOUL@ulcolor\relax
+ \else
+ \def\SOUL@ulcolor{\textcolor{#1}}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\setuloverlap}
+% \begin{macro}{\SOUL@uloverlap}
+% Set the overlap amount, that helps to avoid gaps on sloppy output
+% devices.
+%
+% \begin{macrocode}
+\def\setuloverlap#1{\def\SOUL@uloverlap{#1}}
+\setuloverlap{.25pt}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@ulsetup}
+% The underlining driver is quite simple. No need for \cs{\SOUL@postamble}
+% and \cs{\SOUL@everytoken}.
+%
+% \begin{macrocode}
+\def\SOUL@ulsetup{%
+ \SOUL@setup
+ \let\SOUL@preamble\SOUL@ulpreamble
+ \let\SOUL@everysyllable\SOUL@uleverysyllable
+ \let\SOUL@everyspace\SOUL@uleveryspace
+ \let\SOUL@everyhyphen\SOUL@uleveryhyphen
+ \let\SOUL@everyexhyphen\SOUL@uleveryexhyphen
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@textul}
+% Describing self-explanatory macros is \emph{so} boring!
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\textul{\SOUL@ulsetup\SOUL@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\setul}
+% \begin{macro}{\SOUL@uldepth}
+% \begin{macro}{\SOUL@ulthickness}
+% Set the underlining dimensions. Either value may be omitted and
+% lets the respective macro keep its current contents.
+%
+% \begin{macrocode}
+\def\setul#1#2{%
+ \if$#1$\else\def\SOUL@uldepth{#1}\fi
+ \if$#2$\else\def\SOUL@ulthickness{#2}\fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\resetul}
+% Set reasonable default values that fit most latin fonts.
+%
+% \begin{macrocode}
+\def\resetul{\setul{.65ex}{.1ex}}
+\resetul
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\setuldepth}
+% This macro sets all designated ``letters'' (\cs{\catcode=11}) or the
+% given material in a box and sets the underlining dimensions according
+% to the box depth.
+%
+% \begin{macrocode}
+\def\setuldepth#1{{%
+ \def\SOUL@n{#1}%
+ \setbox\z@\hbox{%
+ \tracinglostchars\z@
+ \ifx\SOUL@n\empty
+ \count@\z@
+ \loop
+ \ifnum\catcode\count@=11\char\count@\fi
+ \ifnum\count@<\@cclv
+ \advance\count@\@ne
+ \repeat
+ \else
+ #1%
+ \fi
+ }%
+ \dimen@\dp\z@
+ \advance\dimen@\p@
+ \xdef\SOUL@uldepth{\the\dimen@}%
+}}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The \texorpdfstring{\st{overstriking}}{overstriking} driver}
+%
+% \begin{macro}{\SOUL@stpreamble}
+% Striking out is just underlining with a raised line of a different
+% color. Hence we only need to define the preamble accordingly and
+% let the underlining preamble finally do its job. Not that colored
+% overstriking was especially useful, but we want at least to keep
+% it black while we might want to set underlines in some fancy color.
+%
+% \begin{macrocode}
+\def\SOUL@stpreamble{%
+ \dimen@\SOUL@ulthickness
+ \dimen@i=-.5ex
+ \advance\dimen@i-.5\dimen@
+ \edef\SOUL@uldepth{\the\dimen@i}%
+ \let\SOUL@ulcolor\SOUL@stcolor
+ \SOUL@ulpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@stsetup}
+% We re-use the whole underlining setup and just replace the preamble
+% with our modified version.
+%
+% \begin{macrocode}
+\def\SOUL@stsetup{%
+ \SOUL@ulsetup
+ \let\SOUL@preamble\SOUL@stpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\textst}
+% These pretzels are making me thirsty \dots
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\textst{\SOUL@stsetup\SOUL@}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@stcolor}
+% \begin{macro}{\setstcolor}
+% Set the overstriking color. This won't be used often, but is required
+% in cases, where the underlines are colored. You wouldn't want to
+% overstrike in the same color. Note that overstriking lines are
+% drawn \emph{beneath} the text, hence bright colors won't look good.
+%
+% \begin{macrocode}
+\let\SOUL@stcolor\relax
+\def\setstcolor#1{%
+ \if$#1$
+ \let\SOUL@stcolor\relax
+ \else
+ \def\SOUL@stcolor{\textcolor{#1}}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection{The highlighting driver}
+%
+% \begin{macro}{\SOUL@hlpreamble}
+% This is nothing else than overstriking with very thick lines.
+%
+% \begin{macrocode}
+\def\SOUL@hlpreamble{%
+ \setul{}{2.5ex}%
+ \let\SOUL@stcolor\SOUL@hlcolor
+ \SOUL@stpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\SOUL@hlsetup}
+% No need to re-invent the wheel. Just use the overstriking setup
+% with a different preamble.
+%
+% \begin{macrocode}
+\def\SOUL@hlsetup{%
+ \SOUL@stsetup
+ \let\SOUL@preamble\SOUL@hlpreamble
+}
+% \end{macrocode}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \begin{macro}{\texthl}
+% \begin{macro}{\sethlcolor}
+% \begin{macro}{\SOUL@hlcolor}
+% Define the highlighting macro and the color setting macro with a
+% simple default color. Yellow isn't really pleasing, but it's already
+% predefined by the \package{color} package.
+%
+% \begin{macrocode}
+\DeclareRobustCommand*\texthl{\SOUL@hlsetup\SOUL@}
+\def\sethlcolor#1{\if$#1$\else\def\SOUL@hlcolor{\textcolor{#1}}\fi}
+\sethlcolor{yellow}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \subsection*{The package postamble}
+%
+% \begin{macro}{\so}
+% \begin{macro}{\ul}
+% \begin{macro}{\st}
+% \begin{macro}{\hl}
+% \begin{macro}{\caps}
+% OK, I lied. The short macro names are just abbreviations for their
+% longer counterpart. Some people might be used to |\text*| style commands
+% to select a certain font. And then it doesn't hurt to reserve
+% these early enough.
+%
+% \begin{macrocode}
+\let\so\textso
+\let\ul\textul
+\let\st\textst
+\let\hl\texthl
+\let\caps\textcaps
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% When used in an environment other than \LaTeX\ and the \package{german}
+% package was already loaded, define the double quotes as accent.
+%
+% \begin{macrocode}
+\ifx\documentclass\@undefined
+ \ifx\mdqoff\@undefined
+ \else
+ \soulaccent{"}%
+ \fi
+ \catcode`\@=\atcode
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \noindent
+% If we have been loaded by a \LaTeX\ environment and the \package{color}
+% package wasn't also loaded, we disable all colors. Then we add the umlaut accent
+% |"| if the \package{german} package is present. The quotes character has to
+% be \cs{\catcode}'d \cs{\active} now, or it won't get recognized later.
+% The \option{capsdefault}
+% option overrides the \cs{\caps} driver and lets \cs{\SOUL@} set an underline.
+% Finally load the local configuration, process the |capsdefault|
+% option and exit.
+%
+% \begin{macrocode}
+\else
+ \bgroup
+ \catcode`\"\active
+ \AtBeginDocument{%
+ \@ifundefined{color}{%
+ \let\SOUL@color\relax
+ \let\setulcolor\@gobble
+ \let\setstcolor\@gobble
+ \let\sethlcolor\@gobble
+ \let\hl\ul
+ }{}
+ \@ifundefined{mdqoff}{}{\soulaccent{"}}
+ }
+ \egroup
+ \DeclareOption{capsdefault}{%
+ \AtBeginDocument{%
+ \def\SOUL@capsdfltfnt#1{%
+ \SOUL@ulsetup
+ \SOUL@ulpreamble
+ \scshape
+ }%
+ }%
+ }
+ \InputIfFileExists{soul.cfg}%
+ {\PackageInfo{soul}{Local config file soul.cfg used}}{}
+ \ProcessOptions
+\fi
+\endinput
+% \end{macrocode}
+%
+%
+%
+%
+%^^A--------------------------------------------------------------------
+%
+%
+%
+%
+% \vspace{2explus1fill}
+%\begin{verbatim}
+%$Id: soul.dtx,v 1.128 2003/11/17 22:57:24 m Rel $
+%\end{verbatim}
+% \Finale
+%
+%
+% ^^A.E.I.O.U.^^
+%^^A vim:ts=4:sw=4:et
diff --git a/obsolete/macros/generic/soul/soul.ins b/obsolete/macros/generic/soul/soul.ins
new file mode 100644
index 0000000000..451343f7df
--- /dev/null
+++ b/obsolete/macros/generic/soul/soul.ins
@@ -0,0 +1,10 @@
+%% LaTeX2e file `soul.ins'
+%% generated by the `filecontents' environment
+%% from source `soul' on 2003/11/17.
+%%
+\def\batchfile{soul.ins}
+\input docstrip.tex
+\askforoverwritefalse
+\keepsilent % <-- this is for you, Christina ;-)
+\generate{\file{soul.sty}{\from{soul.dtx}{package}}}
+\endbatchfile
diff --git a/obsolete/macros/generic/soul/soul.pdf b/obsolete/macros/generic/soul/soul.pdf
new file mode 100644
index 0000000000..d60e6ba326
--- /dev/null
+++ b/obsolete/macros/generic/soul/soul.pdf
Binary files differ
diff --git a/macros/generic/soul/soul.txt b/obsolete/macros/generic/soul/soul.txt
index c44b4100fd..c44b4100fd 100644
--- a/macros/generic/soul/soul.txt
+++ b/obsolete/macros/generic/soul/soul.txt
diff --git a/systems/doc/hitex/hiformat.hnt b/systems/doc/hitex/hiformat.hnt
index 5e37fa7567..44414a303c 100644
--- a/systems/doc/hitex/hiformat.hnt
+++ b/systems/doc/hitex/hiformat.hnt
Binary files differ
diff --git a/systems/doc/hitex/hiformat.pdf b/systems/doc/hitex/hiformat.pdf
index 4057b5749c..2c952afbc4 100644
--- a/systems/doc/hitex/hiformat.pdf
+++ b/systems/doc/hitex/hiformat.pdf
Binary files differ
diff --git a/systems/doc/hitex/hintmac.tex b/systems/doc/hitex/hintmac.tex
index 1fa9d7232f..e57b4ef476 100644
--- a/systems/doc/hitex/hintmac.tex
+++ b/systems/doc/hitex/hintmac.tex
@@ -198,7 +198,7 @@
\def\TUG{\TeX\ \UG}
\def\tug{\acro{TUG}}
\def\UG{Users Group}
-\ifacro
+\ifpdf
\sanitizecommand{\TeX}{TeX}
\sanitizecommand{\eTeX}{eTeX}
\sanitizecommand{\Prote}{PRoTE}
@@ -1503,7 +1503,7 @@
\else\ifpdf
\def\includefig#1{\leavevmode\hbox{\immediate\pdfximage{image/#1.pdf}\pdfrefximage\pdflastximage}}
\else\ifhint
- \def\includefig#1{\image=image/#1.png\relax}
+ \def\includefig#1{\HINTimage=image/#1.png\relax}
\else
\input epsf.tex
\def\includefig#1{\epsfbox{image/#1.eps}}% this is a \leavevmode\hbox{...}
diff --git a/systems/doc/hitex/hitexman.hnt b/systems/doc/hitex/hitexman.hnt
index ac7d0cc356..75a7123362 100644
--- a/systems/doc/hitex/hitexman.hnt
+++ b/systems/doc/hitex/hitexman.hnt
Binary files differ
diff --git a/systems/doc/hitex/hitexman.pdf b/systems/doc/hitex/hitexman.pdf
index 4cfaf2b1b2..c6b3608548 100644
--- a/systems/doc/hitex/hitexman.pdf
+++ b/systems/doc/hitex/hitexman.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 a74f4ce640..eaec5049af 100644
--- a/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
+++ b/systems/texlive/tlnet/tlpkg/installer/ctan-mirrors.pl
@@ -117,9 +117,6 @@ $mirrors = {
'http://ftp.ntua.gr/mirror/ctan/' => 1,
'https://ftp.cc.uoc.gr/mirrors/CTAN/' => 1,
},
- 'Hungary' => {
- 'https://mirror.szerverem.hu/ctan/' => 1,
- },
'Italy' => {
'https://ctan.mirror.garr.it/mirrors/ctan/' => 1,
},
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb b/systems/texlive/tlnet/tlpkg/texlive.tlpdb
index 83d0f4474b..154508ba2c 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/65855
+depend revision/65866
name 00texlive.image
category TLCore
-revision 65848
+revision 65862
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
@@ -3624,6 +3624,7 @@ runfiles size=12964
tlpkg/tlpsrc/recipe.tlpsrc
tlpkg/tlpsrc/recipebook.tlpsrc
tlpkg/tlpsrc/recipecard.tlpsrc
+ tlpkg/tlpsrc/recorder-fingering.tlpsrc
tlpkg/tlpsrc/rectopma.tlpsrc
tlpkg/tlpsrc/recycle.tlpsrc
tlpkg/tlpsrc/refcheck.tlpsrc
@@ -4707,7 +4708,7 @@ depend setting_available_architectures:aarch64-linux amd64-freebsd amd64-netbsd
name 00texlive.installer
category TLCore
-revision 65850
+revision 65857
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
@@ -16272,7 +16273,7 @@ catalogue-version 0.1
name algpseudocodex
category Package
-revision 64654
+revision 65860
shortdesc Package for typesetting pseudocode
relocated 1
longdesc This package allows typesetting pseudocode in LaTeX. It is
@@ -16283,22 +16284,22 @@ longdesc guide lines and the ability to draw boxes around parts of the
longdesc code for highlighting differences. This package also has better
longdesc support for long code lines spanning several lines and improved
longdesc comments.
-containersize 6984
-containerchecksum bd31c62258b5f61afa6155b8c1847031c40c1d1dac7ab7f32f8a365191edc2db80dfac84cf47661003c8c00f530158e850660cba0a1b46558195d4bcd9c9352f
-doccontainersize 350996
-doccontainerchecksum 5a1b9403fbd8eb8620e658cfecffb2ac7313bbca29a798318b462720f109d5d75bf11919caed09e2e90e7f9b86faa5654b5079bfdb39d4a071c57a707bd87d65
+containersize 9192
+containerchecksum 7b69eddad12567fb6fea17a3205c56e695ba73015143239def94e56adde3194dc847ee049ccbdde15e5a402be02c0aa7459f9ad20b1c2e0a1150ac06cc3f24e2
+doccontainersize 352120
+doccontainerchecksum 2ea383e6427973ae31d54d8f04cb45e2ffe649310c66d8d9866160ac7f71af786ab0899b48bc8f7c704fc8b54063df3a5e786d7d808aabc371eea96dc00fdfc6
docfiles size=93
RELOC/doc/latex/algpseudocodex/README.md details="Readme"
RELOC/doc/latex/algpseudocodex/algpseudocodex.pdf details="Package documentation"
RELOC/doc/latex/algpseudocodex/algpseudocodex.tex
-runfiles size=8
+runfiles size=10
RELOC/tex/latex/algpseudocodex/algpseudocodex.sty
catalogue-contact-bugs https://github.com/chrmatt/algpseudocodex/issues
catalogue-contact-repository https://github.com/chrmatt/algpseudocodex
catalogue-ctan /macros/latex/contrib/algpseudocodex
catalogue-license lppl1.3c
catalogue-topics pseudocode
-catalogue-version 1.0.2
+catalogue-version 1.1.0
name algxpar
category Package
@@ -54104,18 +54105,18 @@ catalogue-version 1.0
name changelog
category Package
-revision 56338
-shortdesc Provides a changelog environment
+revision 65861
+shortdesc Typesetting keepachangelog.com style changelogs
relocated 1
longdesc This package provides a changelog environment (which itself
longdesc provides a version environment) to represent a changelog. The
longdesc package supports multiple authors, unreleased changes, and
longdesc yanked (revoked) releases. Inspired by keepachangelog.com.
-containersize 3024
-containerchecksum f91facbc1ee2f959fb9d4ea679b0d2f9b740664e7b7941a02a87c1df23545591e0f355713f35a7c01504105dcfd33820dfef266529be4965b606bb1647c7c503
-doccontainersize 164420
-doccontainerchecksum d3e62f5756bb5c0159523bb23d9c3c9f05725b2756913747410f6e58d41924b88aeb9746faf1bed8847a51295963d30cdfa8d6bb72df423ec2af899f1e399e5e
-docfiles size=55
+containersize 3324
+containerchecksum 9b3fd70ebd0563138e2811ec8d8748dce3d04b18da636b884887424960ee69fdd30902b85b968ee9f545d57f8dcf8f6f137174b8ea9a7049308cd778f52afbe2
+doccontainersize 173956
+doccontainerchecksum c729c19b2a80eca9735e2caa46832da20975c89810d3f669c93e66ee4a768877c7ff30d71b2f887dace78303773eaf549ed32a001124304b82d4d51c57cc100b
+docfiles size=57
RELOC/doc/latex/changelog/LICENSE.txt
RELOC/doc/latex/changelog/README.md details="Readme"
RELOC/doc/latex/changelog/changelog.pdf details="Package documentation"
@@ -54128,9 +54129,9 @@ runfiles size=3
catalogue-contact-bugs https://github.com/9999years/latex-changelog/issues
catalogue-contact-repository https://github.com/9999years/latex-changelog
catalogue-ctan /macros/latex/contrib/changelog
-catalogue-license gpl3
-catalogue-topics version-control doc-mgmt
-catalogue-version 2.4.0
+catalogue-license lppl1.3c
+catalogue-topics version-control doc-mgmt expl3
+catalogue-version 2.5.0
name changepage
category Package
@@ -72469,7 +72470,7 @@ containerchecksum c17510f676b4aec1887893083e00438be77d879e44e52aedeb040ae1eb593d
name collection-music
category Collection
-revision 64966
+revision 65862
shortdesc Music packages
relocated 1
longdesc Music-related fonts and packages.
@@ -72503,13 +72504,14 @@ depend octave
depend piano
depend pmx
depend pmxchords
+depend recorder-fingering
depend songbook
depend songproj
depend songs
depend xml2pmx
depend xpiano
-containersize 484
-containerchecksum 5d416eca3382c36a869959d850de6ffb4606c1a15c5adeae2ed0f8800c4a95cb068b4fbacb8d835ba4b0b4880b05f603b4e0ba36b98e357ec5ba637d0fb59100
+containersize 496
+containerchecksum 951e172129275fa2cb7ccea6bf23f27484503533ebee4c3bef7d2f4ddda5940c15713b104a584704a0b9ec710e2ae363b6ec130747a6e169a7c461e509714a77
name collection-pictures
category Collection
@@ -196024,7 +196026,7 @@ catalogue-topics maths luatex
name luatex
category TLCore
-revision 65743
+revision 65866
shortdesc The LuaTeX engine
longdesc LuaTeX is a greatly extended version of pdfTeX using Lua as an
longdesc embedded scripting language. The LuaTeX project's main
@@ -196045,10 +196047,10 @@ depend unicode-data
execute AddFormat name=dviluatex engine=luatex options="dviluatex.ini" patterns=language.def,language.dat.lua fmttriggers=cm,etex,hyphen-base,knuth-lib,plain,tex-ini-files,unicode-data,hyph-utf8
execute AddFormat name=luatex engine=luatex options="luatex.ini" patterns=language.def,language.dat.lua fmttriggers=cm,etex,hyphen-base,knuth-lib,plain,tex-ini-files,unicode-data,hyph-utf8
containersize 12832
-containerchecksum e3bca92f5219c58921d3c234009e5c86746998f18bc39780b2703418be7acda1657659d8c29dc8c6b88f70a6e6867bf8686e559c3c6f398a37de86e4247016e0
-doccontainersize 1905336
-doccontainerchecksum 8ab653fa323ea8e6307ba02d10f7351efa80c78f7809d38219927eed457658b06535abdca9e826859b819e324b835e987ce3d9e640e419ec4c1639e3dfadca84
-docfiles size=707
+containerchecksum 3bac06a5349e13d48ffebee9e78e271d8ea64d0e1b55df018ee1fab2533fbde3d9e9f99b64c3dbd3026c24b61bf6b867684489a73202cfdeb620558522c53b7f
+doccontainersize 1905932
+doccontainerchecksum ed7298a561425d7e5776ac6555716b2b57f0d16584a871de94c5c341f0d8023bbb341b2deb78dc313e9aaff18659b49f24c41063a5719a43b67e5b074fc0d3b5
+docfiles size=708
texmf-dist/doc/luatex/base/graphics/luaharfbuzz.pdf
texmf-dist/doc/luatex/base/luatex-backend.tex
texmf-dist/doc/luatex/base/luatex-callbacks.tex
@@ -269005,6 +269007,34 @@ catalogue-license lppl
catalogue-topics cooking
catalogue-version 2.0
+name recorder-fingering
+category Package
+revision 65862
+shortdesc Package to display recorder fingering diagrams
+relocated 1
+longdesc This package provides support for generating and displaying
+longdesc fingering diagrams for baroque fingering recorders. Standard
+longdesc fingerings are provided for recorders in both C and F, along
+longdesc with methods to create and display alternate fingerings for
+longdesc trills, etc.
+containersize 3660
+containerchecksum afdc421fda5d58f5430b6655031b5539bc84b8742bb7f1ef0d8587211e362fb0f9288e6fafc47909b9585c6717cefec180ad8fc02d094bb87a3fea82cffac09b
+doccontainersize 130652
+doccontainerchecksum 1c162dda334b6d701b05c5040ec02cae8582d8a182de9bddb13d99af9d4399a44bc97f2c1545ee2e3c6cc650e9addfa0a074c56557fd3dd3da0109b5ad597fdd
+docfiles size=37
+ RELOC/doc/latex/recorder-fingering/README.md details="Readme"
+ RELOC/doc/latex/recorder-fingering/RecorderInCchart.png
+ RELOC/doc/latex/recorder-fingering/recorder-fingering.pdf details="Package documentation"
+ RELOC/doc/latex/recorder-fingering/recorder-fingering.tex
+runfiles size=3
+ RELOC/tex/latex/recorder-fingering/recorder-fingering.sty
+catalogue-contact-bugs https://github.com/amunn/recorder-fingering/issues
+catalogue-contact-repository https://github.com/amunn/recorder-fingering
+catalogue-ctan /macros/latex/contrib/recorder-fingering
+catalogue-license lppl1.3
+catalogue-topics music diagram pgf-tikz
+catalogue-version 1.0
+
name rectopma
category Package
revision 19980
@@ -283682,7 +283712,7 @@ catalogue-version 1.6a
name simpleicons
category Package
-revision 65720
+revision 65858
shortdesc Simple Icons for LaTeX
relocated 1
longdesc Similar to FontAwesome icons being provided on LaTeX by the
@@ -283690,10 +283720,10 @@ longdesc fontawesome package, this package aims to do the same with
longdesc Simple Icons. For reference, visit their website:
longdesc https://simpleicons.org/.
execute addMap simpleicons.map
-containersize 2729040
-containerchecksum ebcd2ce44ca0383bccf37b4d6c88ba1d4c5a46ff7f0a801ed1e85655716df65c4384af5e9b87d9b1e620584bf120905bbdc81f68f8f5703b7ddd316007fe08e3
-doccontainersize 2004596
-doccontainerchecksum 559e3dd57aed0784fe07d3e2d1837cd1fde4d169d55891a67464105829f28c450d987b3b2f44cacae5f040848afb66eb0d585d64681332c067de73e92dac7a56
+containersize 2733556
+containerchecksum 118ff53dcbfc1e90f68555fb88c88ec8040224d3ee363fe99f815d35148967ebc88d58c3e263987d2afbb6c669cfe908039559571cf53a3c16c3cf35aa1ae52c
+doccontainersize 2006600
+doccontainerchecksum 697d4add567f0300edc0292782b992868725be221480061e6b45824af48e591a09765649369a8893ded35145a4802c04bb4e21775068e507128a8938b947078f
docfiles size=522
RELOC/doc/fonts/simpleicons/README.md details="Readme"
RELOC/doc/fonts/simpleicons/bindings.tex
@@ -283741,7 +283771,7 @@ catalogue-contact-repository https://github.com/ineshbose/simple-icons-latex
catalogue-ctan /fonts/simpleicons
catalogue-license cc-by-1
catalogue-topics font font-symbol font-supp-symbol font-otf font-type1
-catalogue-version 8.4.0
+catalogue-version 8.5.0
name simpleinvoice
category Package
@@ -297651,17 +297681,17 @@ catalogue-version 1.4
name tangramtikz
category Package
-revision 65697
+revision 65859
shortdesc Tangram puzzles, with TikZ
relocated 1
longdesc This package provides some commands (with English and French
longdesc keys) to work with tangram puzzles: \begin{EnvTangramTikz} and
longdesc \PieceTangram to position a piece, \TangramTikz to display a
longdesc predefined Tangram.
-containersize 4820
-containerchecksum fd11ad6f692d2578c644bb537089ee0533bcb404b7fe75779edf1081109a62027ffab49d2d16e48c69e512917355aa004083b8938f9a7293ef187f24b9018ac3
-doccontainersize 723896
-doccontainerchecksum 4e15154f9b05f689f015d2fe4c468d1ce079708009c7c04d0c5694761b53451caf5168a2a962fd8e6eebf49bbdb1b2301246861f65460f2af7cfade2d564edf3
+containersize 5052
+containerchecksum 1dbbbf2fee45aaa2fff01926de3800f6d071a8c698c56d0b46fa55b4e1bd827745c3adb7e7002289d57b6be5b5621de2ef44e97201316c4837662a74a6cd5bc6
+doccontainersize 727008
+doccontainerchecksum 9b1c94a9c3a41eea1257db4c9b346b84c4793140de7f90d3b7ff55bf3522107777a210d75be7f8ebe7b4ab461f479b6fb19c6d42f8f3208c6363b4e5f56f0c76
docfiles size=228
RELOC/doc/latex/tangramtikz/README.md details="Readme"
RELOC/doc/latex/tangramtikz/TangramTikz-doc-en.pdf details="Package documentation (English)"
@@ -297675,7 +297705,7 @@ catalogue-contact-repository https://github.com/cpierquet/TangramTikz
catalogue-ctan /graphics/pgf/contrib/tangramtikz
catalogue-license lppl1.3c
catalogue-topics puzzle games pgf-tikz
-catalogue-version 0.1.2
+catalogue-version 0.1.3
name tap
category Package
@@ -312612,7 +312642,7 @@ docfiles size=376
name texlive-scripts
category TLCore
-revision 65850
+revision 65857
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.
@@ -312620,10 +312650,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 113820
-containerchecksum 89bafa3ed285cfc5425441c11fdbe0a4db1d89c941c3ab88c8f0458523282b7291ea82487a92e00b932012ef90901f3e039ce10e5d9eaa36a5724c5a96520c70
+containersize 113796
+containerchecksum fbf5c502131c077a5a22f4402147ce1cd4a8f6b281fdee710269899949e3e5f8a54d2b034d043f7be41c3c2ff9d1c0db117e365da168d6ee3a4a12cff92754f3
doccontainersize 424612
-doccontainerchecksum 0de52cc6975752a9125d7c796535345f2ea20045c8fa2c4156b55f38b3966a712d3979062752db57f7ea5abe41d1339474ddd6b4768b7c3592a2fa4d77d39012
+doccontainerchecksum 16e6a54ac95b3032c5e4a447b72fa69d6ed27784fb7caaf0cdb80a1fbe6abfc9ae645ce2a366e10a0d22b9f40238b4c798b218e7cf7fc44732b2570009bfda7c
docfiles size=534
doc.html
texmf-dist/doc/man/man1/fmtutil-sys.1
@@ -317418,7 +317448,7 @@ catalogue-topics maths-theorem decoration
name thmtools
category Package
-revision 65733
+revision 65863
shortdesc Extensions to theorem environments
relocated 1
longdesc The bundle provides several packages for commonly-needed
@@ -317428,10 +317458,10 @@ longdesc theorem and amsthm packages. Features of the bundle include: a
longdesc key-value interface to \newtheorem; a \listoftheorems command;
longdesc hyperref and autoref compatibility; a mechanism for restating
longdesc entire theorems in a single macro call.
-containersize 13412
-containerchecksum 25cba766788101818dcee326d05fd63d3a2210708662f4e4a2bf5578cf16c1d9cbb4c38c64640ef2e463d3e6eeb4873c9364812eacb899c0c523ceedb8cc5d1c
-doccontainersize 265092
-doccontainerchecksum 868d7264992837f9a9c97c5e52fc4d7c5188c9db9a139da0d3c886846530d73f241f212fa0c489d8ad1be576877007e3ad7d0b4fc1ce5b5248b49cfd874200d1
+containersize 13416
+containerchecksum 371801b9ab63eb0ce401bbb56e9b2b52cebf927e7d433d10e94c60c3649187b88957cbe05f2c9995d9bf687a6e6708f8a26f02596dbdd2759107ca61171bcd6b
+doccontainersize 265140
+doccontainerchecksum 753143eda92a887d6217f2dd3b727e78ff7441b109e8fc99eb0a672674a4ce0e3d7a1efd10f3252c2a14ebc87a37687511589e0f91cd4bd79a8298edfc7ad299
docfiles size=81
RELOC/doc/latex/thmtools/COPYING
RELOC/doc/latex/thmtools/README.md details="Readme"
@@ -317439,9 +317469,9 @@ docfiles size=81
RELOC/doc/latex/thmtools/changes.txt
RELOC/doc/latex/thmtools/thmtools-manual.pdf details="Package documentation"
RELOC/doc/latex/thmtools/thmtools-manual.tex
-srccontainersize 20732
-srccontainerchecksum 1349643e6427eb5c6433c9e1291578b940b94e54ef36a507c4e2ff664631a81273eb7fe0bb4aa58b54656828d883828ccffc189f0b957d6956fb6de2d0446a27
-srcfiles size=29
+srccontainersize 20756
+srccontainerchecksum 1114b1aee91c98ec2fa19858cc108ec264e717b525cc86a19e985abf74eb29123c0f7d3f9a0e5bbee9984c062adeb1de95344c579e3675d6181d125b7db69bf7
+srcfiles size=30
RELOC/source/latex/thmtools/aliasctr.dtx
RELOC/source/latex/thmtools/parseargs.dtx
RELOC/source/latex/thmtools/thm-amsthm.dtx
@@ -317481,7 +317511,7 @@ catalogue-contact-repository https://github.com/muzimuzhi/thmtools
catalogue-ctan /macros/latex/contrib/thmtools
catalogue-license lppl1.3c
catalogue-topics maths maths-theorem
-catalogue-version 74
+catalogue-version 75
name threadcol
category Package
@@ -351776,7 +351806,7 @@ catalogue-version 1.00
name xduts
category Package
-revision 65794
+revision 65864
shortdesc Xidian University TeX Suite
relocated 1
longdesc XDUTS is designed to help Xidian University students use LaTeX
@@ -351785,15 +351815,15 @@ 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 523820
-containerchecksum eac28632b1f6d3d009ca2ee367641aaf2445776e7e2fbb99451fc8410459985b1cd602e8d4fcc0b69fe2cbcd032ce04a5a7fc6974b89904728752a82f673b89c
-doccontainersize 327600
-doccontainerchecksum a87ab7e517e4b68686a2b1eed1c77e52ad700e3fc5373e859a4f77a14943a7aef20c207db5306c63a6227ee132fb9b3f300eae786c2216c84d51e12f0ae3d2ff
+containersize 523832
+containerchecksum eac24388da95ebbfccea2014469a203a3365e55962d4ad679d547ceac45872b74ae9cf4d45ca3e3008cba2730717b031b7ce160d8eaf25270c84d3f134e67912
+doccontainersize 327672
+doccontainerchecksum 07491f3de9eab94e9ddcf086be2b5ff2e130776fc094819299228ea8ec8cb84433049062d84a5769d3e74c36ccc74353733eeba7b17111b280941c3778779faa
docfiles size=82
RELOC/doc/xelatex/xduts/README.md details="Readme"
RELOC/doc/xelatex/xduts/xduts.pdf details="Package documentation" language="zh"
-srccontainersize 44308
-srccontainerchecksum 40fe2f99ad1d168c8f1e559ea585e2c54046fe09e8f91df0b515308825f582999b6cc34f58621fdd66cf0dc36abc396decbab5c4558fdcb7ee691a4df19c3148
+srccontainersize 44372
+srccontainerchecksum 679f496f764fbd8fc7c4012afd6d4ebbe48cc7927a7a07f1d11e700e07b3fe24dcebc0260b44a100a6e2050680750af86d76414598dbd3dcdc79de5d0db6db06
srcfiles size=70
RELOC/source/xelatex/xduts/xduts.dtx
RELOC/source/xelatex/xduts/xduts.ins
@@ -351809,9 +351839,9 @@ catalogue-contact-development https://github.com/note286
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 lppl
+catalogue-license lppl1.3c
catalogue-topics dissertation proposal expl3 xetex
-catalogue-version 4.4.5.3
+catalogue-version 4.4.5.5
name xdvi
category TLCore
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
index eed6e39095..02c0341014 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.md5
@@ -1 +1 @@
-be6943e41051d9d77077b6c197a65467 texlive.tlpdb
+dca1e8dc473a71cd5203874e1f8f02fc texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512 b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
index f242d9b59b..cadca4e7bc 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512
@@ -1 +1 @@
-53f4f2dd34c2f3ba21ca2ca0b96a60d59ded13d3d0e2f457a291eb863c32a1219e7528df9f590cfc74fd607af449009a490a652f926397d18b66ab52e424dbff texlive.tlpdb
+8e3e8ebc679edd096f15cc13efe85f0285738271e884447f0b7f746ffe737029ff34548a660cb7722677c523cb3b5765097f104ca12d0bdc0e0b30d9b327be5b texlive.tlpdb
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.sha512.asc
index 997f202cf7..a6e3ca53f3 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-----
-iQEcBAEBCgAGBQJj7tArAAoJEEzhh34ZQ4xwOJoIAIwWjObNOfs3YiAEFWDYmjKp
-wLwlQAnjC/0yGhqJCFHRiJaXHqxjEPCkDM/SOIZGnOuRKJvgn9K7C/24pkQpP+SQ
-pw3DvfFIXcp7VasMP9YNl2Sw8A23q7MJPEm8jEXwi3yKBWlgQ/yKhuh0KPsu0ssd
-pftVrYkQLcJDeEnUqBtvwLCEEl3tLPFeAbhsA5RDFIWThkdjxytqSaXzVZ5+8a4F
-6jX6a1CuIASudahkSaiFulA3y2ioQxIfHTFjSEZGs20phC+HwL7AU4HIiuHu/rO+
-jVsZSwYNchHw0HNXHSMcFLOl0sSgSUBuZsS+kKXvBH6Y79DuIewO/nk/HrxHmho=
-=uF2F
+iQEcBAEBCgAGBQJj8CFyAAoJEEzhh34ZQ4xwLK8IAIlt2dyeZ4lyM/tkbSm+wd7U
+sXs8PL1NqhMMWiLNjfxcklvKUThzhpqJhp6oczYA0+cAfXllxz8Zv2X3xPBg+CwC
+RhWrO0b7gK8ClUMewNyTHaeS3H/180J2O3AjCrShwzhayDVXl5k5Yh4RqzeVxnEf
+BBU76Q/V/811aE9nvOJEjhemthplh9ov8eP8lH3sSDFPwA5J67Yl1iIC3kXus050
+o7uMW35BjepsVye5S4KLAFnLdn4kzMDRhoe/0Qg1YRkibQP5Qa15HWjX91QvS5wJ
+Ex4A9MbsHu/qJhh2Mgx46aSM/ZwsbZHkR/dbtIIpDL97t/CMqbHlh8vYDAXDmSg=
+=Jak/
-----END PGP SIGNATURE-----
diff --git a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
index 37b816bcbd..46d72cfd80 100644
--- a/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
+++ b/systems/texlive/tlnet/tlpkg/texlive.tlpdb.xz
Binary files differ
diff --git a/timestamp b/timestamp
index 6d91031ded..15c2c243e5 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:
-2023-02-18-02-02
+2023-02-19-02-02